2012-06-24 69 views
1

我正在尋找一種方法來強制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正在等待另一個線程提交。 這個解決方案不好,因爲兩個線程都會選擇違反第四個條件的其他線程更新的行。任何人都可以想出一種方法來改進此解決方案或提供符合所有標準的其他方法嗎?

+0

我無法用我的informix db複製上述問題。 –

回答

1

第四個條件否認死鎖的可能性。

當兩個線程在等待另一個線程釋放資源(同時持有另一個需要的資源)時發生死鎖,但第四個條件排除了這種可能性。

+0

謝謝,這很有道理。 – AtomHeartFather