[解決済み】楽観的なロックと悲観的なロック
質問
楽観的ロックと悲観的ロックの違いは理解できました。 では、一般的にどのような場合にどちらを使うのか、どなたか説明していただけませんか?
また、ストアドプロシージャを使ってクエリを実行するかどうかで、この質問に対する答えは変わるのでしょうか?
ただ、念のため、楽観的な意味は "読み取り中にテーブルをロックしない" で、悲観的な意味は "読み取り中にテーブルをロックする" です。
解決方法は?
オプティミスティック・ロック は、レコードを読み込んでバージョン番号を記録し(これを行う他の方法として、日付、タイムスタンプ、チェックサム/ハッシュがあります)、レコードを書き戻す前にバージョンが変更されていないことをチェックする戦略です。 あなたがレコードを書き戻すと、それが原子であることを確認するために、バージョンで更新をフィルタリングします。(つまり、バージョンをチェックしてからレコードをディスクに書き込むまでの間に更新されていないこと)、そして一発でバージョンを更新します。
もしレコードが汚れていたら(つまり自分と違うバージョン)、トランザクションを中断し、ユーザーはそれを再スタートすることができます。
この戦略は、必ずしもセッションのためにデータベースへの接続を維持しない、大容量システムや3層アーキテクチャに最も適しています。 このような状況では、接続はプールから取得され、あるアクセスから次のアクセスまで同じ接続を使用するとは限らないので、クライアントは実際にデータベースロックを維持することはできません。
悲観的なロック は、そのレコードを使い終えるまで、自分専用にロックする場合です。 楽観的なロックよりも整合性が高いのですが、アプリケーションの設計には注意が必要です。 デッドロック . 悲観的なロックを使用するには、データベースへの直接接続が必要です。 2層クライアントサーバー アプリケーション)、または接続とは無関係に使用できる外部トランザクションIDを使用することができます。
後者の場合、TxIDでトランザクションを開き、そのIDを使用して再接続します。 DBMSはロックを維持し、TxIDを介してセッションを再開することができます。 これは、2相コミットプロトコルを使用する分散トランザクション(例えば XA または COM+トランザクション )が動作します。
関連
-
[解決済み] 「ストアドプロシージャが見つかりませんでした
-
[解決済み] SQL Server Error "String Data, Right Truncation "の意味と修正方法について教えてください。
-
[解決済み] 分散型トランザクションを開始できない
-
[解決済み] SSIS - データ損失の可能性があるため、値を変換することはできません。
-
[解決済み] T-SQL XOR 演算子
-
[解決済み] create関数は、バッチ内の唯一のステートメントでなければなりません。
-
[解決済み] 一括読み込みができません。オペレーティングシステムのエラーコード5(アクセスが拒否されました。)
-
[解決済み] SQL ServerでRegExを使用する
-
[解決済み] SQLサーバーを使用して文字列を切り詰める方法
-
[解決済み] クラスター化インデックスと非クラスター化インデックスの実際の意味は何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】SQL Server データベース復元エラー:指定されたキャストは有効ではありません。(SqlManagerUI)
-
[解決済み] SQL Server : ログインに成功しましたが、「データベース [dbName] にアクセスできません。(ObjectExplorer) "と表示されました。
-
[解決済み] 変数に値を代入するSELECT文は、データ検索操作と組み合わせてはいけません。
-
[解決済み] 監査失敗、クレデンシャル検証 4776
-
[解決済み] SQL ServerでRegExを使用する
-
[解決済み] データベースとスキーマの違い
-
[解決済み] SQLのReplace関数内の正規表現?
-
[解決済み] 日付から年内の週番号を取得する
-
[解決済み] SQL Server のストアドプロシージャを SQL Developer で実行するには?
-
[解決済み] データベース内の全テーブルのサイズを取得する