ホームページ >データベース >mysql チュートリアル >MySQL の楽観的ロックと悲観的ロックの概要 (コード例)

MySQL の楽観的ロックと悲観的ロックの概要 (コード例)

不言
不言転載
2019-02-01 10:13:553746ブラウズ

この記事では、MySQL の楽観的ロックと悲観的ロックの概要 (コード例) を紹介します。必要な方は参考にしていただければ幸いです。

  • データベース管理システムにおける同時実行制御のタスクは、トランザクションとトランザクションの分離と統一性を破壊することなく、複数のトランザクションがデータベース内の同じデータに同時にアクセスできるようにすることです。データベースの統一

  • オプティミスティック ロックとペシミスティック ロックの同時実行制御で使用される主な技術的手段

ペシミスティック ロック

  • リレーショナル データベース管理システムでは、悲観的同時実行制御 (悲観的ロック、PCC) は同時実行制御の 1 つの方法です。これにより、トランザクションが他のユーザーに影響を与えるような方法でデータを変更することを防ぎます。トランザクションによって実行される操作のデータの各行にロックが適用されている場合、トランザクション ロックが解放された場合にのみ、他のトランザクションはロックと競合する操作を実行できます

  • #悲観的な同時実行制御は、主に激しいデータ競合が発生する環境で使用されます。同時実行の競合が発生した場合、ロックを使用してデータを保護するコストは、トランザクションをロールバックするコストよりも低くなります

悲観的ロックとは、外部 (システムの他の現在のトランザクションや外部システムからのトランザクション処理を含む) によって変更されるデータに対する保守的な態度 (悲観的) を指すため、データは夏休みの処理中ずっとロックされます。 。悲観的ロックの実装は通常、データベースによって提供されるロック メカニズムに依存します (推奨チュートリアル:

MySQL チュートリアル)

  • データベースにおける悲観的ロックのプロセスは次のとおりです。次のように

    • レコードを変更する前に、レコードに排他ロックを追加してください。

    • ロックが失敗した場合は、次のことを意味します。レコードが変更中である場合、現在のクエリは待機するか、例外をスローする必要がある場合があります。

    • ロックが正常にロックされている場合は、レコードを変更でき、その後ロックが解除されます。トランザクションは完了しました

    • #レコードを変更するか排他的ロックを追加する他の操作がある場合、ロックが解除されるか直接例外がスローされるまで待機します
    • ##悲観的ロックは MySQL InnoDB で使用されます
MySQL はデフォルトで自動コミット モードを使用するため、悲観的ロックを使用するには、mysql データベースの自動コミット属性をオフにする必要があります。つまり、更新操作を実行すると、MySQL はすぐに結果を送信します
//开始事务
begin;/begin work;/start transaction;(三者选一个)
select status from t_goods where id=1 for update;
//根据商品信息生成订单
insert into t_orders (id,goods_id) values (null,1);
//修改商品status为2
update t_goods set status=2;
// 提交事务
commit;/commit work;

上記のクエリ ステートメントでは、select...for update メソッドを使用して、悲観的ロックをオンにして実装しています。排他的ロック。その後、対応するレコードがロックされ、他のトランザクションは実行する前にこのトランザクションが送信されるまで待機する必要があります。

データをロックするために更新に select... を使用しますが、次のことを行う必要があります。いくつかのロック レベルに注意してください。MySQL InnoDB はデフォルトで行レベルのロックを使用します。行レベルのロックはインデックスに基づいています。SQL ステートメントがインデックスを使用しない場合、テーブル全体のロックには行レベルのロックは使用されません。

特長

データ処理のセキュリティを保証します
  • 効率の面では、ロック処理 このメカニズムにより、データベースに追加のオーバーヘッドが発生し、デッドロックの可能性が高まります。
  • 読み取り専用トランザクションでは競合が発生しないため、ロックを使用する必要はありません。システム負荷が増加し、並列性が低下します。
  • オプティミスティック ロック

オプティミスティック同時実行制御も同時実行制御の 1 つの方法です。
  • マルチユーザーの同時トランザクションが処理中に相互に影響を及ぼさないと仮定すると、各トランザクションは、データ更新を送信する前に、ロックを生成せずに影響するデータの部分を処理できます。トランザクションは、トランザクションがデータを読み取った後、まず他のトランザクションがデータを変更したかどうかを確認し、変更されている場合は、送信トランザクションをロールバックします。
  • オプティミスティック ロック相対 悲観的ロックの場合、データは競合しないと想定されているため、データが更新のために送信されると、データの競合が正式に検出されます。競合が見つかった場合は、ユーザーが何をすべきかを決定できるようにエラー メッセージが返されます。 Do

オプティミスティック ロックの実装では、通常、レコードのバージョン番号を使用し、データにバージョン ID を追加し、データが更新されるときにバージョン ID を更新します
  • # #実装

  • バージョン番号を使用する場合、データの初期化中にバージョン番号を指定でき、データの更新操作ごとにバージョン番号に対して 1 つの操作が実行されます。そして、現在のバージョン番号がデータの最新バージョン番号であるかどうかを確認します。
1.查询出商品信息
select (status,status,version) from t_goods where id=#{id}
2.根据商品信息生成订单
3.修改商品status为2
update t_goods 
set status=2,version=version+1
where id=#{id} and version=#{version};
機能

オプティミスティック同時実行制御では、トランザクション間でデータが競合する可能性は小さいと考えられるため、次のように直接実行します。ロックは送信されるまでロックされないため、ロックやデッドロックは発生しません。

以上がMySQL の楽観的ロックと悲観的ロックの概要 (コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。