Informix — сценарий взаимоблокировки с участием одной таблицы

Я ищу способ вызвать тупик в 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 ожидают фиксации другого потока. Это решение не является хорошим, потому что оба потока выбирают строки, обновленные другим потоком, что нарушает четвертое условие. Может ли кто-нибудь придумать способ улучшить это решение или предоставить другое, отвечающее всем критериям?


person AtomHeartFather    schedule 24.06.2012    source источник
comment
Я не могу воспроизвести вышеуказанную проблему с моей базой данных informix.   -  person Priyansh Goel    schedule 23.06.2016


Ответы (1)


Четвертое условие исключает возможность взаимоблокировки.

Взаимная блокировка возникает, когда каждый из двух потоков ожидает от другого освобождения ресурса (удерживая при этом ресурс, который требуется другому), но ваше четвертое условие исключает такую ​​возможность.

person Jonathan Leffler    schedule 24.06.2012
comment
Спасибо, это имеет смысл. - person AtomHeartFather; 30.06.2012