Informix - 涉及单个表的死锁场景

时间:2012-06-24 19:23:27

标签: informix database-deadlocks

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

1 个答案:

答案 0 :(得分:1)

第四个条件否认了死锁的可能性。

当两个线程都在等待另一个线程释放资源(同时持有另一个想要的资源)时会发生死锁,但是你的第四个条件排除了这种可能性。