データベースでは、メイン テーブル A とサブテーブル B という状況によく遭遇します。テーブル B には、テーブル A の主キーが外部キーとして含まれています。データを挿入する場合は、まずテーブル A に挿入し、次にテーブル A の ID を取得し、次にテーブル B に挿入します。削除操作を実行する場合は、最初にサブテーブル B を削除し、次にメインテーブル A を削除します。プログラミングでは、2 つのテーブルに対する操作は 1 つのトランザクションで完了します。
システムを頻繁に使用する場合、挿入と削除の操作が同時に発生することがあります。このとき、挿入トランザクションは、メインテーブル A に排他ロックを設定し、次にサブテーブル B にアクセスします。同時に、削除トランザクションはサブテーブル B に排他ロックを設定し、次にサブテーブル B にアクセスします。メインテーブルAにアクセスします。挿入トランザクションは常にテーブル A を独占してテーブル B へのアクセスを待機し、削除トランザクションもテーブル B を独占してテーブル A へのアクセスを待機します。 したがって、2 つのトランザクションは互いにテーブルを独占し、相手の解放を待ちます。リソースが不足し、デッドロックが発生します。
これを行うには 3 つの方法があると聞いたことがあります。
1. 2 つのテーブル AB の間の外部キー関係を解除します。これにより、データを削除するときに、最初にメイン テーブル A を削除し、次にサブテーブル B を削除できます。これら 2 つのテーブル操作のトランザクション アクセス シーケンスは一貫しています。
2 テーブル A のデータを削除する前に、まずトランザクションを使用して、テーブル B の関連する外部キーがテーブル A の別のデータを指すようにします (たとえば、テーブル A にデータの行を作成し、主キーを 0 に設定します。この行のデータはアクセスされません。削除操作を実行します)。これにより、2 つのテーブル AB 内の削除対象のデータ間の関係が排除されます。次に、削除トランザクションを使用して最初にテーブル A のデータを削除し、次にテーブル B のデータを削除すると、挿入トランザクションによる一貫したテーブル アクセスが実現され、デッドロックが回避されます。
3. 外部キー関係の「削除ルール」を「カスケード」に設定すると、削除トランザクションはサブテーブルBを操作せずにメインテーブルAを直接削除するだけで済みます。削除ルールがカスケードに設定された後、メインテーブルのデータが削除され、サブテーブルの外部キーに関連付けられているすべてのデータも同時に削除されるためです。
上記の 3 つの解決策はすべて同僚からの提案であり、どの方法を使用するべきかわかりません。
この状況でデッドロックを防ぐ他の良い方法はないでしょうか?
http://www.cnblogs.com/studyzy/archive/2007/06/11/779811.html