1

ロック システムを備えたデータベースを実装したいとします。ロック回避を使用して、データベースを取得する前に潜在的なデッドロックを回避しようとします。

私の質問は:

セッション/トランザクションがリソース A の取得に成功し、リソース B のロックを取得しようとすると、デッドロックが検出されます。

したがって、セッションは B のロックの取得に失敗します。システムは、セッションが保持している他のリソース (この場合は A) を強制的に放棄し、セッションを無効にする必要がありますか?

または、この状況に対処するための他のより標準的な方法はありますか?

4

3 に答える 3

4

競合する (デッドロックされた) トランザクションを解決する通常の方法は、トランザクションの 1 つをロールバックし、後で (もう一方のトランザクションが両方のロックを解放した後で) 再試行することです。

しかし、トランザクションが何らかのプログラミング言語で開かれた場合、データベースはトランザクションの開始からすべてのコードを再実行できません。そのため、デッドロックが発生したことをアプリケーションに通知することしかできません。アプリケーション開発者は、トランザクション全体を再試行するコードを作成する必要があります。

アプリケーションがSoftware Transactional Memoryのようなものを使用している場合、アプリケーションはデータベース トランザクションに統合され、アプリケーションの状態を自動的にロールバックし、トランザクション全体を再試行できることに注意してください。

于 2010-07-07T15:15:04.080 に答える
1

SQL Serverは、説明しているのと同様の方法でデッドロックを処理します。2つのセッションのいずれかをデッドロックの犠牲者として選択し、セッションを終了/無効にします。

于 2010-07-07T14:53:12.453 に答える
0

デッドロックが検出された場合は、エラーを発生させて、プログラマーがモデルを変更する必要があることを示します。

于 2010-07-07T14:46:45.947 に答える