【发布时间】:2012-06-24 19:23:27
【问题描述】:
我正在寻找一种方法来强制 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 正在等待其他线程提交。 这个解决方案不好,因为两个线程都选择了另一个线程更新的行,这违反了第四个条件。谁能想到改进此解决方案或提供其他满足所有标准的方法?
【问题讨论】:
-
我无法用我的 informix 数据库复制上述问题。
标签: informix database-deadlocks