我正在尋找一種方法來強制Informix IDS 11.50發生死鎖。該解決方案必須滿足以下條件:Informix - 涉及單表的死鎖情況
- 只有一個表參與,
- 隔離級別:
COMMITTED READ
, ROW
級鎖,- 兩個線程,但只有一個可以訪問的行(S )由另一個修改。
,我想出了一個滿足每一個條件,但最後一個解決方案:
表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
這些線程是死鎖ng導致SELECT正在等待另一個線程提交。 這個解決方案不好,因爲兩個線程都會選擇違反第四個條件的其他線程更新的行。任何人都可以想出一種方法來改進此解決方案或提供符合所有標準的其他方法嗎?
我無法用我的informix db複製上述問題。 –