赞
踩
Mysql在可重复读隔离级别下如何保证事务较高的隔离性。
–MVCC。
可重复读的隔离级别下使用了MVCC(multi-version concurrency control)机制,select操作不会更新版本号,是快照读(历史版本);insert、update和delete会更新版本号,是当前读(当前版本),获取到当前最新值。
同样的sql查询select语句在一个事务里多次执行查询结果相同,就算其它事务对数据有修改也不会影响当前事务sql语句的查询结果。
这个隔离性就是靠MVCC(Multi-Version Concurrency Control)机制来保证的。
Mysql在读已提交和可重复读隔离级别下都实现了MVCC机制。
MVCC机制的实现就是通过read-view机制与undo版本链比对机制,使得不同的事务会根据数据版本链对比规则读取同一条数据在版本链上的不同版本数据。
undo:撤销。
undo日志版本链是存储引擎级别的,binlog日志是server级别的。
undo日志版本链是指一行数据被多个事务依次修改过后,在每个事务修改完后(不管事务有没有提交,版本链上都会有记录),Mysql会保留修改前的数据undo回滚日志,并且用两个隐藏字段trx_id和roll_pointer把这些undo日志串联起来形成一个历史记录版本链(见下图,需参考视频里的例子理解)
分析图中的readview:100和200都是未提交的事务, 300是已提交的最大事务id。
1.1 undo日志版本链的作用
撤销,也就是事务回滚。
举例:
比如事务1提交前最后的操作是name=“lilei3”;
事务2在对name="lilei3"进行两次update,然后进行rollback,那么rollback之后的name为lilei3.
2. read-view一致性视图
在可重复读隔离级别,当事务开启,执行任何查询sql时会生成当前事务的一致性视图read-view,该视图在事务结束之前都不会变化(如果是读已提交隔离级别在每次执行查询sql时都会重新生成),
这个视图由执行查询时所有未提交事务id数组(数组里最小的id为min_id)和已创建的最大事务id(max_id)组成,
事务里的任何sql查询结果需要从对应版本链里的最新数据开始逐条跟read-view做比对从而得到最终的快照结果。
begin/start transaction 命令并不是一个事务的起点,在执行到它们之后的第一个修改update操作InnoDB表的语句,事务才真正启动,才会向mysql申请事务id,mysql内部是严格按照事务的启动顺序来分配事务id的。
如果事务只是在一直select是不会生成事务id的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。