この記事では、mysql に関する関連知識を提供します。主に、MySQL トランザクションの使用と長時間トランザクションのリスク、MySQL トランザクションとその特性、同時トランザクションの影響について紹介します。質問、トランザクション分離レベルについて説明します。とデモ、シングルバージョン管理ロックやマルチバージョン同時実行制御MVCCなどを一緒に見ていきましょう。
# 推奨学習: ##1. MySQL トランザクションの使用法#MySQL では、トランザクション サポートはエンジン層で実装されており、MyISAM エンジンはトランザクションをサポートしません
2. トランザクションの 4 つの特性: トランザクションのすべての操作は完了または不完全であり、中間段階では終了しません。
一貫性 : トランザクションの前後でデータベースの整合性制限が破られることはありません。
分離: 複数のトランザクションがデータベース内の同じデータに同時にアクセスすると、関係が表示されます。
永続性 : トランザクションの完了後、トランザクションによって行われた変更は永続化され、失われることはありません。
ACID は、Redo および Undo ログを通じて保証する必要があります。 MySQL ログ システムの詳細説明: (後日追加)
3. MySQL トランザクションの使用法BEGIN -- 开启事务 START TRANSACTION -- 开启事务 INSERT INTO fork_business_detail VALUES ( 4, '123', '123', '123004', '2022-11-12 17:17:29', '1', '2022-11-12 17:17:37', '1' ); COMMIT -- 提交事务 ROLLBACK -- 回滚事务
set autocommit=0 -- 关闭自动提交 INSERT INTO fork_business_detail VALUES ( 4, '123', '123', '123004', '2022-11-12 17:17:29', '1', '2022-11-12 17:17:37', '1' ); COMMIT -- 提交事务 ROLLBACK -- 回滚事务
(
RU、Read Uncommitted)。トランザクションの中間プロセスを読み取ることができます。 ACID プロパティに違反しており、ダーティ リードの問題があります。したがって、基本的には使用されず、無視して問題ありません。 Read Committed (
RC、Read Committed)。これは、他のトランザクションがコミットされている場合、これが最も一般的に使用されるレベルでもあることがわかります。ただし、歴史的な理由により、RC は運用環境ではあまり使用されない可能性があります。 Repeatable Read (
RR、Repeatable Read) は、現在最も広く使用されているレベルです。ギャップ ロック機能があり、これがまだデフォルト レベルです。このレベルでは、デッドロック、同時実行性の低下、その他の問題が頻繁に発生します。 Serialization (シリアル化可能) は、すべての実装がロックを通じて実装されているため、マルチバージョン実装ではなく、単一バージョン実装です。基本的には使用しないので無視して構いません。
2. 同時トランザクションによって引き起こされる問題
#Non-repeatable read: トランザクション A は同じデータを複数回読み取ります。トランザクション B は、トランザクション A の複数回の読み取り中にデータを更新およびコミットするため、トランザクション A が同じデータを複数回キャプチャすると、一貫性のない結果が生じます。
トランザクションが別のトランザクションによって送信されたデータを読み取るため、前後で 2 回読み取られたデータが異なります幻读:A查出来数据,此时B提交,A再次查同一数据时结果不一致。一个事务前后两次读取的数据不一致,是因为其他事务插入数据导致的事务并发情况
不可重复读和幻读很容易混淆,不可重复读侧重于修改,而幻读侧重于添加或删除。要解决不可重复读取的问题,只需要锁,符合条件的行,而要解决幻读问题需要锁表。
SELECT @@transaction_isolation; -- 查看mysql事务隔离级别 SELECT @@tx_isolation; -- 查看mysql事务隔离级别
将事务隔离级别修改为读未提交,可以看到,事务还没有提交,这时候去查询这条数据,发现数据已经可见了。
set session transaction isolation level read uncommitted; -- 设置成读未提交 SELECT @@tx_isolation; -- 查看mysql事务隔离级别 START TRANSACTION -- 事务A INSERT INTO fork_business_detail VALUES ( 4, '123', '123', '123004', '2022-11-12 17:17:29', '1', '2022-11-12 17:17:37', '1' ); ROLLBACK select * from fork_business_detail where id= 4 -- 事务B
一个事务读取到其他事务已提交的数据导致前后两次读取数据不一样的情况。
select * from fork_business_detail where id= 4; BEGIN; -- 开启事务 select * from fork_business_detail where id= 4; UPDATE fork_business_detail set SUB_ODR_ID=123004 where id= 4; COMMIT; select * from fork_business_detail where id= 5;
serializable ,使用锁独占方式来确保只有一个版本时事务被隔离,因此锁可以理解为单版本控制。
在MySQL事务中,锁的实现与隔离级别有关。在RR(Repeatable Read)隔离级别下,MySQL使用间隙锁来防止以并行性为代价写入数据,以解决虚拟读取的问题。
这种类型的锁通常会导致死锁,因为它没有足够的并行性和许多冲突。现在流行的Row模式可以避免许多冲突甚至死锁,因此建议默认使用Row+RC(Read Committed)模式隔离级别,这可以大大提高数据库的读写并行性。
多版本控制,也称为MVCC,是指数据的多版本处理,以实现数据库中的高度并发数据访问,以及事务的可见性,以确保事务可以看到其应该看到的数据版本。
如何生成多个版本?
每次修改数据库时,撤消( Undo log)日志都会记录当前修改记录的事务号和修改前数据状态的存储地址(即ROLL_PTR),以便在必要时回滚旧数据版本。
例如,读取事务查询当前记录,但最近的事务尚未提交。根据原子性,读取事务无法看到最新的数据,但您可以在回滚段中找到旧版本数据,从而生成多个版本。
多版本控制巧妙地将独占和独占的稀有资源转换为并发,大大提高了数据库吞吐量和读/写性能。
推荐学习:mysql视频教程
以上がMySQL のトランザクション分離メカニズムと実装原理の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。