我正在寻找一种方法来强制 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 正在等待其他线程提交。这个解决方案不好,因为两个线程都选择了另一个线程更新的行,这违反了第四个条件。任何人都可以想出一种方法来改进此解决方案或提供满足所有标准的其他解决方案吗?