たとえば、テーブル A とテーブル B が存在し、A と B で更新を処理する必要があり、使用中に両方のテーブルをロックすることにしました (私のアーキテクトの要求に従って)。同時に、テーブル B をロックしてから A をロックする別のプロシージャが呼び出されます。
この取引は完了しますか?リソースを解放していないので、デッドロックだと確信しています...
たとえば、テーブル A とテーブル B が存在し、A と B で更新を処理する必要があり、使用中に両方のテーブルをロックすることにしました (私のアーキテクトの要求に従って)。同時に、テーブル B をロックしてから A をロックする別のプロシージャが呼び出されます。
この取引は完了しますか?リソースを解放していないので、デッドロックだと確信しています...
はい、デッドロックの可能性があります。
デッドロックのシナリオは
自分のタスク ロック A
他のタスク ロック B
あなたのタスクはBをロックしようとしますが、ロックを持っているのでできず、他のタスクはAをロックしようとしますが、あなたが持っているのでできません。
したがって、これらのタスクの 1 つが失敗/ロールバックして、他のタスクが完了できるようにする必要があります。使用される RDBMS に応じて、データベースはこれらのいずれかを選択して終了します。
多くの場合、解決策は、すべてのプロセスでリソースを同じ順序でロックする必要があるというガイドラインです。通常、これは手動で実施する必要があります。
はい。このアプローチは、ここで述べたように、古典的な循環デッドロックで終了します
更新に TABLE レベルのロックを使用するのはやり過ぎです。これを行う理由は何ですか? 正しいインデックスがあれば、キー レベルでロックが取得され、複数のプロセスが問題のテーブルに同時にアクセスするのに役立ちます。
それでも、可能な限り同じ順序でテーブルにアクセスすることをお勧めします。