MySQL ロック、トランザクション分離レベル、アプリケーションの関係

王林
リリース: 2023-12-21 08:27:47
オリジナル
1256 人が閲覧しました

MySQL 锁的事务隔离级别与应用

MySQL ロックのトランザクション分離レベルとアプリケーション
データベースでは、トランザクション分離レベルは非常に重要な概念であり、同時トランザクション間の分離の程度を決定します。 MySQL は、READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE の 4 つのトランザクション分離レベルを提供します。トランザクション分離レベルが異なれば、データの読み取りと書き込みに対するロック戦略も異なるため、アプリケーションで適切なトランザクション分離レベルを正しく選択して使用することが重要です。

  1. READ UNCOMMITTED (コミットされていない読み取り): このレベルでは、トランザクションは他のトランザクションからコミットされていないデータを読み取ることができます。これは、ダーティ リード、つまり検証されていないデータが読み取られる可能性があることを意味します。特別な状況下で非常にリアルタイムのデータを取得する必要がある場合を除き、このレベルは通常推奨されません。
  2. READ COMMITTED (コミットされた読み取り): このレベルでは、トランザクションは送信されたデータの読み取りのみが可能です。これにより、ダーティ リードの問題は回避されますが、再現不可能な読み取りの問題が発生する可能性があります。非反復読み取りとは、同じトランザクション内で同じデータを 2 回読み取ることを指しますが、結果に一貫性がありません。これは、トランザクションの実行中に他のトランザクションがデータを更新した可能性があるためです。
  3. REPEATABLE READ (反復可能読み取り): このレベルでは、トランザクションは同じデータを複数回読み取り、一貫した結果を得ることができます。これは、読み取りプロセス中にデータをロックすることによって実現されます。 REPEATABLE READ レベルでは、読み取り操作は条件を満たすデータ行のロックを共有するため、他のトランザクションはデータの読み取りのみが可能ですが、データの変更はできません。ただし、ファントム読み取りの問題が依然として発生する可能性があります。ファントム読み取りとは、同じトランザクション内で範囲内のデータを 2 回読み取ることを指しますが、結果に一貫性がありません。これは、トランザクションの実行中に、他のトランザクションによって条件を満たすデータが挿入または削除された可能性があるためです。
  4. SERIALIZABLE (シリアル化): このレベルでは、トランザクションはシリアルに実行されます。これは、同時に 1 つのトランザクションだけがデータを変更でき、他のトランザクションはロックが解放されるのを待っていることを意味します。このレベルでは、ダーティ読み取り、反復不能読み取り、ファントム読み取りの問題を完全に回避できますが、他のトランザクションがロックを解放するのを待つ必要があるため、同時実行パフォーマンスにも大きな影響を与えます。

以下では、特定のコード例を使用して、さまざまなトランザクション分離レベルでのロック戦略を示します。

最初にテスト テーブルを作成します。

CREATE TABLE test_table ( id INT PRIMARY KEY, name VARCHAR(100), age INT );
ログイン後にコピー

次に、さまざまなトランザクションをそれぞれ示します。分離レベルでのロック戦略:

  1. READ UNCOMMITTED:

    -- 执行事务1 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; START TRANSACTION; SELECT * FROM test_table WHERE id = 1; -- 执行事务2 START TRANSACTION; UPDATE test_table SET age = 20 WHERE id = 1; COMMIT; -- 继续执行事务1 SELECT * FROM test_table WHERE id = 1; COMMIT;
    ログイン後にコピー

    この例では、トランザクション 1 は、トランザクション 2 によって変更されたがコミットされていないデータを読み取ります。

  2. READ COMMITTED:

    -- 执行事务1 SET TRANSACTION ISOLATION LEVEL READ COMMITTED; START TRANSACTION; SELECT * FROM test_table WHERE id = 1; -- 执行事务2 START TRANSACTION; UPDATE test_table SET age = 20 WHERE id = 1; COMMIT; -- 继续执行事务1 SELECT * FROM test_table WHERE id = 1; COMMIT;
    ログイン後にコピー

    この例では、トランザクション 1 はトランザクション 2 が送信したデータのみを読み取ることができます。

  3. REPEATABLE READ:

    -- 执行事务1 SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; START TRANSACTION; SELECT * FROM test_table WHERE id = 1; -- 执行事务2 START TRANSACTION; UPDATE test_table SET age = 20 WHERE id = 1; COMMIT; -- 继续执行事务1 SELECT * FROM test_table WHERE id = 1; COMMIT;
    ログイン後にコピー

    この例では、トランザクション 1 はデータの読み取り時に共有ロックを追加し、トランザクション 2 はトランザクション 1 がその前に共有ロックを解放するのを待ちます。実行できます。

  4. SERIALIZABLE:

    -- 执行事务1 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; START TRANSACTION; SELECT * FROM test_table WHERE id = 1; -- 执行事务2 START TRANSACTION; UPDATE test_table SET age = 20 WHERE id = 1; COMMIT; -- 继续执行事务1 SELECT * FROM test_table WHERE id = 1; COMMIT;
    ログイン後にコピー

    この例では、トランザクション 1 はデータの読み取り時に共有ロックを追加し、トランザクション 2 はトランザクション 1 が共有ロックを解放するまで待機します。処刑される。

    上記のコード例を通じて、さまざまなトランザクション分離レベルでロック戦略がどのように機能するかを確認できます。実際のアプリケーション開発では、適切なトランザクション分離レベルを選択することが非常に重要であり、特定のビジネス シナリオやパフォーマンス要件に応じて選択できます。

    以上がMySQL ロック、トランザクション分離レベル、アプリケーションの関係の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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