隔离级别实现原理(MVCC)
MVCC(多版本并发控制Multi-Version Concurrent Control)是MySql提高性能的一种方式,配合Undo log和版本链,让不同的事物的读-写,写-丢操作可以并发执行,从而提升系统性能.
MVCC使得数据库读不会对数据加锁,普通的SELECT请求不会加锁,提高了数据的并发处理能力.借助MVCC,数据库可以实现(读已提交)READ COMMITTED,(可重复读)REPETABLE READ等隔离级别.
InnoDB的MVCC是通过在每行记录后面保存两个隐藏的列来实现的,一个保存了行的事物Id(DB_TRX_ID),一个保存了行的回滚指针(DB_ROLL_PT).
db_trx_id:每次对某条聚簇索引记录进行改动时,都会把对应的事务id赋值给trx_id隐藏列.
db_roll_pt:每次对某条聚簇索引记录进行改动时,都会把旧的版本写入到undo log 日志中,然后这个隐藏列相当于一个指针,可以通过它来找到该记录修改前的信息.
ReadView
Read View是事务开启时,当前所有事务的一个集合,这个数据结构中存储了当前Read View中最大的ID及最小的ID
对于使用READ UNCOMMITTED(读未提交)隔离级别的事务来说,直接读取最新版本就好,对于使用SERIALIZABLE(串行化)隔离级别的事务来说,使用加锁的方式来访问记录.
对于使用READ COMMITTED(读已提交)和REPETABLE READ(可重复读),就需要用到版本链,核心问题:需要判断一个版本链中的那个版本是当前事务可见的.
ReadView: