MySQL MVCC 原則が明らかに: 同時トランザクションでの読み取りと書き込みの競合にどう対処するか?
はじめに:
データベース システムでは、トランザクションの同時実行が不可欠です。ただし、同時実行には一連の問題も発生します。その 1 つは読み取りと書き込みの競合です。複数のトランザクションが同じデータを同時に読み書きすると、不整合が発生する可能性があります。この問題を解決するために、MySQL はマルチバージョン同時実行制御 (MVCC) メカニズムを導入しました。この記事では、MVCC の原理を明らかにし、MySQL が同時トランザクションにおける読み取りと書き込みの競合をどのように処理するかを詳細に分析します。
a) データ行の作成バージョン番号がトランザクション開始時刻より大きい場合、データ行が後で作成されたことを意味し、このトランザクションは見えない。
b) 削除されたデータ行のバージョン番号がトランザクション開始時刻以下の場合、データ行は削除されており、このトランザクションは表示されないことを意味します。
c) データ行の作成バージョン番号がトランザクション開始時刻以下で、削除バージョン番号がトランザクション開始時刻より大きいか空の場合、このトランザクションは表示されます。
上記のルールにより、トランザクションは開始前に送信されたデータを読み取ることができますが、コミットされていないデータや他の実行中のトランザクションによって変更されたデータは表示されません。
a) トランザクション A がデータ行を変更したいが、そのデータ行が他のトランザクション B によって変更されている場合 (つまり、バージョン番号が一致しない場合) )、トランザクション A はロールバックされ、書き込み操作の競合を示すエラー メッセージが表示されます。
b) トランザクションがデータ行を削除したいが、データ行が他のトランザクションによって変更されている場合 (つまり、バージョン番号が一致しない場合)、トランザクションはデータ行の新しいバージョンを作成し、削除マークを現在のトランザクションのバージョン番号に設定します。
c) トランザクションによって変更または削除されるデータ行が存在しない場合 (つまり、バージョン番号が空の場合)、トランザクションはデータ行の新しいバージョンを作成し、バージョン番号は次のように設定されます。現在のトランザクションのバージョン番号。
MySQL は、上記の処理方法を通じて、トランザクション書き込み操作によってデータの競合や不整合が発生しないことを保証します。
サンプル コード:
MySQL MVCC の原理をよりよく理解するために、同時トランザクションで読み取りと書き込みの競合が発生した場合の処理プロセスを示すサンプル コードを以下に示します。
-- 创建测试表 CREATE TABLE test ( id INT PRIMARY KEY, value VARCHAR(20) NOT NULL, version INT NOT NULL ); -- 插入测试数据 INSERT INTO test (id, value, version) VALUES (1, 'A', 1);
-- 事务1:读操作 START TRANSACTION; SELECT * FROM test WHERE id = 1; -- 结果:id=1, value='A', version=1
-- 事务2:写操作 START TRANSACTION; -- 修改数据行,并将version+1 UPDATE test SET value = 'B', version = version + 1 WHERE id = 1; -- 提交事务 COMMIT;
-- 事务1:再次读操作 SELECT * FROM test WHERE id = 1; -- 结果:id=1, value='B', version=2
上記のコード例では、トランザクション 2 がデータ行を変更した後、トランザクション 1 がデータを再度読み取ると、変更されたデータ行が読み取られ、バージョン値が更新されていることを確認できます。データの一貫性。
結論:
MySQL の MVCC メカニズムは、バージョン番号の判断と処理を通じて、同時トランザクションの読み取り/書き込み競合を解決します。 MySQL は、トランザクションの開始時刻、スナップショットのバージョン番号、データ行のバージョン番号を比較することにより、データの分離と一貫性を実現します。実際のアプリケーションでは、MVCC メカニズムを合理的に使用すると、データベースの同時実行性とパフォーマンスを向上させることができます。
参考文献:
[1] https://dev.mysql.com/doc/refman/8.0/en/innodb-multi-versioning.html
以上がMySQL MVCC 原則が明らかに: 同時トランザクションにおける読み取りと書き込みの競合にどう対処するか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。