0

たとえば、テーブル A とテーブル B が存在し、A と B で更新を処理する必要があり、使用中に両方のテーブルをロックすることにしました (私のアーキテクトの要求に従って)。同時に、テーブル B をロックしてから A をロックする別のプロシージャが呼び出されます。

この取引は完了しますか?リソースを解放していないので、デッドロックだと確信しています...

4

2 に答える 2

1

はい、デッドロックの可能性があります。

デッドロックのシナリオは

自分のタスク ロック A
他のタスク ロック B

あなたのタスクはBをロックしようとしますが、ロックを持っているのでできず、他のタスクはAをロックしようとしますが、あなたが持っているのでできません。

したがって、これらのタスクの 1 つが失敗/ロールバックして、他のタスクが完了できるようにする必要があります。使用される RDBMS に応じて、データベースはこれらのいずれかを選択して終了します。

多くの場合、解決策は、すべてのプロセスでリソースを同じ順序でロックする必要があるというガイドラインです。通常、これは手動で実施する必要があります。

于 2012-07-18T17:41:08.913 に答える
1

はい。このアプローチは、ここで述べたように、古典的な循環デッドロックで終了します

更新に TABLE レベルのロックを使用するのはやり過ぎです。これを行う理由は何ですか? 正しいインデックスがあれば、キー レベルでロックが取得され、複数のプロセスが問題のテーブルに同時にアクセスするのに役立ちます。

それでも、可能な限り同じ順序でテーブルにアクセスすることをお勧めします。

于 2012-07-24T18:16:32.793 に答える