ホームページ >データベース >mysql チュートリアル >MySQL でデータの同時実行制御と競合解決操作を実行するにはどうすればよいですか?

MySQL でデータの同時実行制御と競合解決操作を実行するにはどうすればよいですか?

WBOY
WBOYオリジナル
2023-07-31 11:53:272406ブラウズ

MySQL でデータの同時実行制御と競合解決操作を実行するにはどうすればよいですか?

はじめに:
ほとんどのビジネス シナリオでは、データベースがコア コンポーネントです。複数の同時ユーザーがデータベース上で同時に読み取りおよび書き込み操作を実行すると、データベース内で同時実行制御の問題やデータの競合が発生する可能性があります。これらの問題を解決するために、MySQL はさまざまな同時実行制御メカニズムと競合解決操作を提供します。

1. 同時実行制御メカニズム:

  1. ロック メカニズム:
    MySQL のロック メカニズムは、データのアクセスと変更を制御するために使用されます。ロック機構は、共有ロック (読み取りロック) と排他ロック (書き込みロック) に分かれています。共有ロックを使用すると、読み取り操作の場合は複数のセッションが同時にロックを取得できますが、排他ロックは書き込み操作の場合は 1 つのセッションによってのみ取得できます。
  2. トランザクション:
    トランザクションは、すべてが正常に実行されたか、すべてがロールバックされた一連のデータベース操作の論理単位です。 MySQL は、トランザクションを使用して ACID (原子性、一貫性、分離、耐久性) 機能を実装し、データの整合性と一貫性を確保します。
  3. 分離レベル:
    MySQL は、非コミット読み取り、コミット読み取り、反復可能読み取り、およびシリアル化という 4 つのトランザクション分離レベルを提供します。分離レベルはトランザクション間の相互作用の程度を決定し、さまざまな同時実行制御機能を提供します。

2. 競合解決操作:

  1. オプティミスティック ロック:
    オプティミスティック ロックは、同時アクセスのほとんどの場合に競合が発生しないことを前提としているため、データはロックします。データを更新するときは、バージョン番号またはタイムスタンプを使用して同時実行性の競合を検出し、解決します。競合が発生した場合は、成功するまで戻って再試行してください。

コード例:

-- 创建表
CREATE TABLE items (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50),
    quantity INT,
    version INT
);

-- 插入数据
INSERT INTO items (name, quantity, version) VALUES ('item1', 10, 0);

-- 查询数据
SELECT * FROM items WHERE id = 1;

-- 乐观锁更新数据
START TRANSACTION;
    -- 获取当前版本号
    SELECT version INTO @current_version FROM items WHERE id = 1;

    -- 更新数据
    UPDATE items SET quantity = 5, version = version + 1 WHERE id = 1 AND version = @current_version;
    
    -- 检查是否更新成功
    SELECT ROW_COUNT() INTO @affected_rows;
    
    -- 根据更新结果进行处理
    IF @affected_rows = 0 THEN
        -- 冲突处理代码
        -- 重新尝试更新或抛出异常
    ELSE
        -- 提交事务
        COMMIT;
    END IF;
  1. 悲観的ロック:
    悲観的ロックでは、同時アクセスのほとんどの場合に競合が発生すると想定しているため、データがロックされます。 SELECT FOR UPDATE ステートメントを使用すると、更新するデータに排他ロックが追加され、ロックを取得するまで他のセッションはデータを変更できなくなります。

コード例:

-- 悲观锁更新数据
START TRANSACTION;
    -- 加锁并查询数据
    SELECT * FROM items WHERE id = 1 FOR UPDATE;
    
    -- 更新数据
    UPDATE items SET quantity = 5 WHERE id = 1;
    
    -- 提交事务
    COMMIT;

結論:
MySQL は、オプティミスティック ロックとペシミスティック ロック、および対応する競合解決操作を通じて、ロック メカニズム、トランザクション、分離レベルなどの同時実行制御メカニズムを提供します。これにより、データベースに同時にアクセスするときの競合の問題を効果的に解決できます。特定のアプリケーションでは、ビジネス ニーズとパフォーマンス要件に基づいて、適切な同時実行制御戦略と競合解決操作を選択できます。

(注: 上記のコード例は単なるデモンストレーションであり、特定のビジネスコードではありません。実際のアプリケーションでは、特定の状況に応じて変更および調整してください。)

以上がMySQL でデータの同時実行制御と競合解決操作を実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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