楽観的ロックと悲観的ロック 質問する

楽観的ロックと悲観的ロック 質問する

楽観的ロックと悲観的ロックの違いは理解しています。では、一般的にどちらをいつ使用するのか説明してもらえますか?

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

ただし、念のため確認しておくと、楽観的とは「読み取り中にテーブルをロックしない」ことを意味し、悲観的とは「読み取り中にテーブルをロックする」ことを意味します。

ベストアンサー1

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

レコードがダーティな場合 (つまり、自分のものと異なるバージョンの場合)、トランザクションを中止し、ユーザーがそれを再開できます。

この戦略は、セッション中にデータベースへの接続を必ずしも維持する必要がない高ボリューム システムや 3 層アーキテクチャに最も適しています。この状況では、接続がプールから取得され、1 つのアクセスから次のアクセスまで同じ接続を使用しない可能性があるため、クライアントは実際にはデータベース ロックを維持できません。

悲観的ロックレコードをロックして、使用が終わるまで独占的に使用できるようにする方法です。これは楽観的ロックよりも整合性がはるかに優れていますが、アプリケーション設計に注意して、デッドロック悲観的ロックを使用するには、データベースへの直接接続(通常は2層クライアントサーバーアプリケーション) または接続とは独立して使用できる外部で利用可能なトランザクション ID です。

後者の場合、TxIDでトランザクションを開き、そのIDを使用して再接続します。DBMSはロックを維持し、TxIDを通じてセッションを再開できるようにします。これは、2フェーズコミットプロトコル(1000またはCOM+ トランザクション) 仕事。

おすすめ記事