Informix IDS 11.50 でデッドロックを強制する方法を探しています。ソリューションは、次の条件を満たす必要があります。
- 関係するテーブルは 1 つだけで、
- 分離レベル:
COMMITTED READ
、 ROW
レベルロック、- 2 つのスレッドですが、他のスレッドによって変更された行にアクセスできるのは 1 つだけです。
最後の条件を除くすべての条件を満たすソリューションを思いつきました。
テーブル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 が待機しているため、デッドロックになっています。この解決策は、4 番目の条件に違反する他のスレッドによって更新された行を両方のスレッドが選択するため、適切ではありません。このソリューションを改善したり、すべての基準を満たす他のソリューションを提供したりする方法を考えられる人はいますか?