ホームページ  >  記事  >  悲観的ロックとは何ですか?

悲観的ロックとは何ですか?

Guanhui
Guanhuiオリジナル
2020-06-28 09:52:594501ブラウズ

悲観的ロックとは、外部によって変更されるデータに対する保守的な態度を指します。つまり、データ処理プロセス中にデータがロックされます。この機能は、データベースによって提供されるロック メカニズムに依存する必要があります。それ以外の場合は、システムに実装されている場合でも、ロック メカニズムは外部システムがデータを変更しないことを保証できません。

悲観的ロックとは何ですか?

ロック モード

LockMode.NONE

ロック メカニズムなし

LockMode.READ

Hibernate は、レコードの読み取り時に自動的にロックを取得します。

つまり、共有ロック: (共有ロック、S ロック)、共有ロックは読み取りロックとも呼ばれます。トランザクション T がデータ オブジェクト A の共有ロックを取得した場合 (つまり、A に共有ロックを追加した場合)、他のトランザクションは A の共有ロック (S ロック) のみを取得できますが、排他ロック (X ロック) を追加することはできません。 A がすべての共有ロックを解放するまで。共有ロックが付与されたトランザクションはデータの読み取りのみが可能で、データを変更することはできません。

LockMode.WRITE

更新レコードの挿入時に Hibernate が自動的にロックを取得します

つまり、排他ロック: (排他ロック、X ロック) , 排他ロックは書き込みロックとも呼ばれます。トランザクション T がデータ A の排他ロックを取得した場合、T は A の読み取りと書き込みの両方ができますが、T が A の X ロックを解放するまで、他のトランザクションは A の共有ロックも A の X ロックも取得できません。排他ロック。

LockMode.UPGRADE

データベース システムが悲観的ロック (Oracle や MySQL など) をサポートしている場合は、select...for update ステートメント (行レベルのロック) を実行します。 、他のトランザクションはそのステートメントに対して更新、挿入、削除を実行できません) データベースが悲観的ロックをサポートしていない場合 (Sybase など)、通常の select ステートメントを実行します。

LockMode.UPGRADE_NOWAIT

には、LockMode.UPGRADE と同じ機能があります。さらに、Oracle データベースに対して select...for update nowait ステートメントを実行します。 「nowait」は、select ステートメントを実行しているトランザクションが悲観的ロックをすぐに取得できない場合、他のトランザクションがロックを解放するのを待たずに、ただちにロック例外をスローすることを意味します。

ロックのデモ

注: ロックはトランザクションで操作されるデータ オブジェクトに対してのみ機能し、データベース全体に対しては機能しません。

2 つの SQL コマンド操作ライン インターフェイスを開きます。これらは 2 つのトランザクション T1 と T2 を表すことができます。まず、2 つのインターフェイスでそれぞれコマンドを実行します。 starttransaction;

トランザクション T1 で、データベース内の学生番号「2015」を持つ学生情報をクエリし、操作されたデータに悲観的ロックを追加します。 select * stu_info から。stu_no="2015" が更新用です。現時点では、対応する情報を照会できます。

「更新用」とは、悲観的ロックを追加することを意味します。このクエリの後、トランザクションは送信されません。これは、ロックが解放されていないことを意味します。

トランザクション T2 で、データベース内の学生番号「2016」を含む学生情報をクエリし、悲観的ロックをデータベースに追加します。操作データ: select * from stu_info where stu_no="2016" for update;.現時点では、対応する情報をクエリすることもできます。

トランザクションはまだ送信されていません

トランザクション T2 で、データベース内の学生番号「2015」を持つ学生情報をクエリします。今回は、ロックせずに通常の選択クエリを実行します。 * stu_no=”2015”; の stu_info より。現時点では、対応する情報をクエリすることもできます。

トランザクションはまだ送信されていません

トランザクション T2 で、データベース内の中学校番号「2015」の生徒情報をクエリし、操作されたデータに悲観的ロックを追加してみます。 select * from stu_info where stu_no=" 2015" for update;この時点では、関連する情報は表示されずに待機していることがわかります。トランザクション T1 を送信すると (つまり、コミット)、データ オブジェクト「2015」は T1 の悲観的ロックを解放し、トランザクション T2 が関連情報をクエリして悲観的ロックを取得できるようにします。

ステップ 5 を変更すると。先ほどの 5 番目のステップでは、トランザクション T1 で学生番号を「2016」に変更しましたが、悲観的ロックは追加しませんでした。これは、以前にトランザクション T2 でレコードに悲観的ロックを追加しており、それが解放されていないためです。変更は T2 が送信された後にのみ成功します。

推奨チュートリアル: 「MySQL チュートリアル

以上が悲観的ロックとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。