MySQLの悲観ロックと楽観ロック


関係型データベースにおいて、悲観的なロックと楽観的なロックは資源の併発シーンを解決する解決策です。🔎この二つの同時解決案の実際使用と長所と短所を教えてください。
まずデータベースを定義して、一番簡単な在庫表を作成します。

CREATE TABLE `order_stock` (
 `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
 `oid` int(50) NOT NULL COMMENT '  ID',
 `quantity` int(20) NOT NULL COMMENT '  ',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
quantityは異なる商品のoidの在庫を表しています。続いてOCCとPCCはこのデータベースを使ってデモンストレーションを行います。
楽観ロックOCC
複数のユーザが同時に行うトランザクションは、処理時に互いに影響しないと仮定し、各トランザクションは、ロックが発生しないまま、それぞれの影響のある部分のデータを処理することができる。データの更新を提出する前に、各事務はまずこの事務でデータを読んだ後、他の事務があるかどうかを確認してデータを修正します。他の事務に更新があれば、提出中の事務はロールバックします。
楽観ロック🔒”ロックを持っているユーザーは大体成功すると思いますので、業務を終えてから実際にデータを更新する最後のステップでロックを取ってください。このように、データベース自体で定義された行のロックを使用することを避けることができ、デッドロック現象の発生を防ぐことができます。

UPDATE order_stock SET quantity = quantity - 1 WHERE oid = 1 AND quantity - 1 > 0; 
楽観的併発制御の多くは、データの競合が少なく、衝突が少ない環境において、このような環境では、時としてロールバックトランザクションのコストがデータを読み出す際のロックデータのコストより低いため、他の同時制御方法よりもスループットが高い。
悲観ロックPCC
これは、他のユーザに影響を与えるように、データを修正するためのトランザクションを阻止することができる。ある行のデータを読んでロックを適用した場合、一つの事務がロックを解除してこそ、他の事務がロックと衝突する操作を行うことができます。
このデザインは「ワンロック」を採用しています。🔒二番目の検査🔍三更新モードとは、データベースにselect ... for update のキーワードを持参して、現在の事務に行レベルロックを追加することである。🔒,まず操作するデータをロックしてから対応するクエリーデータを実行して更新操作を行います。

BEGIN
SELECT quantity FROM order_stock WHERE oid = 1 FOR UPDATE;
UPDATE order_stock SET quantity = 2 WHERE oid = 1; 
COMMIT;
MySQLにはもう一つの問題があります。for up date文の実行中にスキャンしたすべての行がロックされます。この点は問題を引き起こしやすいです。したがって、MySQLで悲観的なロックを使用する場合は、全表スキャンではなくインデックスを確定する必要があります。
悲観的併発制御は主にデータ競争の激しい環境と、同時衝突が発生した時にロック保護データを使うコストがロールバック業務のコストを下回る環境に使われます。
OCCとPCCの長所と短所
OCCの長所と短所
【長所】
  • 楽観的なロックは、トランザクション間のデータ競争の確率が小さいので、できるだけ直接にして、提出時までロックします。だから、ロックとデッドロックは一切発生しません。
  • は、迅速に事務に応答し、同時量が増加するにつれて、大量のロールバックが出現する。
  • は効率がいいですが、ロックの強さをコントロールします。
  • 【短所】
  • もし直接簡単にこのようにすれば、やはり予想できない結果に出会うかもしれません。例えば、二つの事務は全部データベースのある一行を読みました。
  • は合併量が増加すると、大量のロールバックが発生します。
  • PCCの長所と短所
    【長所】
    「先に鍵を取ってからアクセスする」という保守的な策略は、データ処理の安全を保証します。
    【短所】
  • はデータベースロックに依存し、効率が低い。
  • ロックを処理するメカニズムは、データベースに追加のオーバーヘッドを発生させ、デッドロックを発生する機会を増加させる。
  • は並列性を低減し、一つの事務がある行のデータをロックしたら、他の事務はこの事務処理が終わってからそのデータを処理できるようにしなければならない。
  • 以上がMySQLの悲観的なロックと楽観的なロックの詳細です。MySQLの悲観的なロックと楽観的なロックに関する詳細については、他の関連記事に注目してください。