1

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 番目の条件に違反する他のスレッドによって更新された行を両方のスレッドが選択するため、適切ではありません。このソリューションを改善したり、すべての基準を満たす他のソリューションを提供したりする方法を考えられる人はいますか?

4

1 に答える 1

1

4番目の条件は、デッドロックの可能性を否定します。

デッドロックは、2つのスレッドがそれぞれ他のスレッドがリソースを解放するのを待っているときに発生します(他のスレッドが必要とするリソースを保持している間)が、4番目の条件はその可能性を排除します。

于 2012-06-24T20:51:05.873 に答える