ホームページ  >  記事  >  データベース  >  ネイティブ サポートなしで MySQL にオプティミスティック ロックを実装するにはどうすればよいでしょうか?

ネイティブ サポートなしで MySQL にオプティミスティック ロックを実装するにはどうすればよいでしょうか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-29 21:53:02691ブラウズ

How Can You Implement Optimistic Locking in MySQL Without Native Support?

MySQL のオプティミスティック ロック: 詳細

データベースの同時更新を管理するために採用されるテクニックであるオプティミスティック ロックは、ネイティブではサポートされていませんMySQLによる。ただし、データベースの実践方法とアプリケーション コードを組み合わせることで実装できます。

オプティミスティック ロックの仕組み

オプティミスティック ロックの背後にある原則は、データがロックされないことを前提としています。同時更新中に競合が発生します。更新前にデータの整合性をチェックすることで、競合の検出が可能になり、適切なアクションを実行できるようになります。

トランザクションがない場合、UPDATE の前に追加の SELECT ステートメントを含めることにより、楽観的ロックが適用されます。この SELECT ステートメントはデータの現在の状態を取得し、更新が試行される前の状態と比較します。データが変更された場合、更新は中止され、データの整合性が維持されます。

MySQL でのオプティミスティック ロックの使用

MySQL でオプティミスティック ロックを実装するには、次の手順を実行できます。アプリケーション コードで実行されます:

  1. SELECT ステートメントを実行してデータの現在の状態を取得します。
  2. データに対して計算またはその他の操作を実行します。
  3. UPDATE を実行します。
  4. UPDATE ステートメントの後に、影響を受ける行の数を確認します。 0 の場合は、データが変更されており、競合が発生していることを示しており、更新は中止できます。

次の例を考えてみましょう。

<code class="sql">SELECT val1, val2 FROM theTable WHERE iD = @theId;

-- Perform data calculations

UPDATE theTable
SET val1 = @newVal1,
    val2 = @newVal2
WHERE iD = @theId
AND val1 = @oldVal1
AND val2 = @oldVal2;

-- Check the number of affected rows
IF @@ROWCOUNT = 1
-- Update successful
ELSE
-- Conflict detected
END</code>

代替のオプティミスティック ロック方法

SELECT-UPDATE-CHECK アプローチとは別に、バージョン列を使用してオプティミスティック ロックを実装することもできます。この列はデータが更新されるたびに増分され、UPDATE ステートメントは行を更新する前にバージョンをチェックします。バージョンが一致しない場合、更新は中止されます。

考慮事項

オプティミスティック ロックは、競合がまれであり、競合を検出するコストがペシミスティックを使用するよりも低いことを前提としています。ロック(トランザクションなどによる)。ただし、同時実行性が高く、データの整合性が重要であるシナリオには適さない可能性があります。

以上がネイティブ サポートなしで MySQL にオプティミスティック ロックを実装するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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