この記事では、MySQL の楽観的ロックと悲観的ロックの概要 (コード例) を紹介します。必要な方は参考にしていただければ幸いです。
データベース管理システムにおける同時実行制御のタスクは、トランザクションとトランザクションの分離と統一性を破壊することなく、複数のトランザクションがデータベース内の同じデータに同時にアクセスできるようにすることです。データベースの統一
オプティミスティック ロックとペシミスティック ロックの同時実行制御で使用される主な技術的手段
リレーショナル データベース管理システムでは、悲観的同時実行制御 (悲観的ロック、PCC) は同時実行制御の 1 つの方法です。これにより、トランザクションが他のユーザーに影響を与えるような方法でデータを変更することを防ぎます。トランザクションによって実行される操作のデータの各行にロックが適用されている場合、トランザクション ロックが解放された場合にのみ、他のトランザクションはロックと競合する操作を実行できます
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 つの方法です。オプティミスティック ロックの実装では、通常、レコードのバージョン番号を使用し、データにバージョン ID を追加し、データが更新されるときにバージョン ID を更新します
- マルチユーザーの同時トランザクションが処理中に相互に影響を及ぼさないと仮定すると、各トランザクションは、データ更新を送信する前に、ロックを生成せずに影響するデータの部分を処理できます。トランザクションは、トランザクションがデータを読み取った後、まず他のトランザクションがデータを変更したかどうかを確認し、変更されている場合は、送信トランザクションをロールバックします。
- オプティミスティック ロック相対 悲観的ロックの場合、データは競合しないと想定されているため、データが更新のために送信されると、データの競合が正式に検出されます。競合が見つかった場合は、ユーザーが何をすべきかを決定できるようにエラー メッセージが返されます。 Do
# #実装
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 サイトの他の関連記事を参照してください。