1. ホーム
  2. sql-server

[解決済み】楽観的なロックと悲観的なロック

2022-03-23 09:40:36

質問

楽観的ロックと悲観的ロックの違いは理解できました。 では、一般的にどのような場合にどちらを使うのか、どなたか説明していただけませんか?

また、ストアドプロシージャを使ってクエリを実行するかどうかで、この質問に対する答えは変わるのでしょうか?

ただ、念のため、楽観的な意味は "読み取り中にテーブルをロックしない" で、悲観的な意味は "読み取り中にテーブルをロックする" です。

解決方法は?

オプティミスティック・ロック は、レコードを読み込んでバージョン番号を記録し(これを行う他の方法として、日付、タイムスタンプ、チェックサム/ハッシュがあります)、レコードを書き戻す前にバージョンが変更されていないことをチェックする戦略です。 あなたがレコードを書き戻すと、それが原子であることを確認するために、バージョンで更新をフィルタリングします。(つまり、バージョンをチェックしてからレコードをディスクに書き込むまでの間に更新されていないこと)、そして一発でバージョンを更新します。

もしレコードが汚れていたら(つまり自分と違うバージョン)、トランザクションを中断し、ユーザーはそれを再スタートすることができます。

この戦略は、必ずしもセッションのためにデータベースへの接続を維持しない、大容量システムや3層アーキテクチャに最も適しています。 このような状況では、接続はプールから取得され、あるアクセスから次のアクセスまで同じ接続を使用するとは限らないので、クライアントは実際にデータベースロックを維持することはできません。

悲観的なロック は、そのレコードを使い終えるまで、自分専用にロックする場合です。 楽観的なロックよりも整合性が高いのですが、アプリケーションの設計には注意が必要です。 デッドロック . 悲観的なロックを使用するには、データベースへの直接接続が必要です。 2層クライアントサーバー アプリケーション)、または接続とは無関係に使用できる外部トランザクションIDを使用することができます。

後者の場合、TxIDでトランザクションを開き、そのIDを使用して再接続します。 DBMSはロックを維持し、TxIDを介してセッションを再開することができます。 これは、2相コミットプロトコルを使用する分散トランザクション(例えば XA または COM+トランザクション )が動作します。