環境
SQL Native Client 9.0 を使用して SQL Server 2000 データベースと通信する C++ アプリケーションに取り組んでいます。
シナリオ
- 2 つの接続が DBMS に対して開かれています
- 各接続はトランザクションを使用するように設定されています
Connection1
で動作するクエリTableA
Connection2
で動作するクエリTableB
TableB
key_id
のフィールドに外部キー制約がありますTableA
次のことを行う関数を作成しました。
begin a transaction on Connection1 & Connection2
prepare a query in TableA on Connection1
prepare a query on TableB on Connection2
begin loop over some_data
(1) insert into key_id on TableA
begin loop over some_other_data
(2) insert into TableB using same key_id as in Table A
end loop
end loop
commit on Connection1
commit on Connection2
私が遭遇したのは、 query(1)
が正常に実行されるということでしたが、 query に対して SQLExecute が呼び出されるとすぐ(2)
に、デバッガーはネバーランドでオフになります。
質問
デッドロックの問題として何が起こっているかを正しく診断していますか?
1Connection
はキーを作成しているTableA
がコミットしていないため、Connection2
それに情報を追加しようとしてTableB
いるため、外部キーの制約により、 にキーが存在する必要があることがわかりましたTableA
。このため、SQLExecute
クエリはブロックされ、トランザクションが完了するのを待ちます。これは、コードの記述方法のおかげで、書き込みが完了するTableA
まで実行できません。TableB
その他の注意事項
この問題を回避するためにコードを作成することはできますが、問題についての私の理解が正しいことを確認したいと思います。