MySQL读取的记录和我想象的不一致
💡
原文中文,约16400字,阅读约需40分钟。
📝
内容提要
介绍MySQL事务隔离级别设置和MVCC原理,可通过修改启动参数或SET语句改变隔离级别,MVCC通过版本链和ReadView实现,ReadView包含活跃事务的事务id列表、最小事务id、下一个事务id和生成该ReadView的事务id。ReadView的可见性规则总结如下:trx_id = creator_trx_id时,该版本可以被当前事务访问;trx_id < min_trx_id时,该版本可以被当前事务访问;trx_id ≥ max_trx_id时,该版本不可以被当前事务访问;min_trx_id ≤ trx_id ≤ max_trx_id之间,需要判断trx_id属性值是不是在m_ids列表中,如果在,该版本不可以被访问;如果不在,该版本可以被访问。
🎯
关键要点
- 事务的特性包括原子性、隔离性、一致性和持久性,统称为ACID。
- MySQL支持四种事务隔离级别:未提交读、已提交读、可重复读和串行读。
- 脏写、脏读、不可重复读和幻读是并发事务中可能出现的一致性问题。
- MySQL的默认隔离级别是可重复读,支持通过SET语句或启动参数修改隔离级别。
- MVCC(多版本并发控制)通过版本链和ReadView实现事务的并发控制。
- ReadView包含活跃事务的事务id列表、最小事务id、下一个事务id和生成该ReadView的事务id。
- ReadView的可见性规则决定了事务能访问哪些版本的数据。
- 长事务会导致大量的回滚日志占用存储空间,影响数据库性能。
- 非聚集索引的可见性判断依赖于PAGE_MAX_TRX_ID属性和聚集索引的版本链。
- MVCC允许在READ COMMITTED和REPEATABLE READ隔离级别下并发执行读写操作,提升系统性能。
➡️