Я ищу способ вызвать тупик в Informix IDS 11.50. Решение должно удовлетворять следующим условиям:
- Задействован только один стол,
- Уровень изоляции:
COMMITTED READ
, ROW
уровень блокировки,- Два потока, но только один может получить доступ к строкам, измененным другим.
Я придумал решение, которое удовлетворяет всем условиям, кроме последнего:
Таблица t1
создается и заполняется следующим образом:
CREATE TABLE t1
(
id SERIAL PRIMARY KEY,
name CHAR(20)
)
LOCK MODE ROW;
CREATE INDEX idx_name on t1 (name);
INSERT INTO t1 (name) VALUES ('A');
INSERT INTO t1 (name) VALUES ('B');
На 2 отдельных консолях dbaccess (с установленным режимом блокировки на 15 секунд) я выполняю следующие команды:
dbaccess #1: BEGIN;
dbaccess #1: UPDATE t1 SET name = name WHERE name = 'A';
dbaccess #2: BEGIN;
dbaccess #2: UPDATE t1 SET name = name WHERE name = 'B';
dbaccess #1: SELECT * FROM t1;
dbaccess #2: SELECT * FROM t1; -- 143: ISAM error: deadlock detected
Эти потоки заблокированы, потому что операторы SELECT ожидают фиксации другого потока. Это решение не является хорошим, потому что оба потока выбирают строки, обновленные другим потоком, что нарушает четвертое условие. Может ли кто-нибудь придумать способ улучшить это решение или предоставить другое, отвечающее всем критериям?