前面提到的在mysql中事务的级别默认是
repeatable read(可重复读)
,其有出现幻读的可能性,即事务A中读到的数据可能是其他事务多次修改提交的阿虎局,导致每次读取的数据都不一样.解决这个问题的办法是使用mvcc多版本控制.
在mysql中,mvcc的实现方式是给每个事务一个递增的版本号,然后每条数据都加上两个隐藏列,分别记录该字段创建时的事务的版本号和删除版本号.
- 具体实现方式如下:
SELECT:
a. 查看创建版本号小于或者等于当前版本号的记录,确保要读取的行是当前事务或者当前事务更早的事务创建的
b. 查看删除版本号,要么删除版本号大于当前版本或者没有定义
只有同时满足上述两个要求的行才会被查找到
INSERT:
修改行的创建版本号为当前版本号
DELETE:
修改行的删除版本号为当前版本号
UPDATE:
修改行的创建版本号为当前版本号和修改行的删除版本号为当前版本号
网友评论