mysql当前读与快照读

快照读

读取的是记录数据的可见版本(可能是过期的数据),不用加锁
实验测试快照读(select时为快照读)
mysql当前读与快照读_第1张图片
由此也可以看出只要事务A还未提交,那么select出来的数据都是read view版本链中的数据,不会因为其它事务的提交或者未提交影响事务对同一张表的查询结果(遵循多版本并发控制规则)
mysql当前读与快照读_第2张图片

当前读(update、insert、delete 当前读)

读取的是记录数据的最新版本,并且当前读返回的记录都会加上锁,保证其他事务不会再并发的修改这条记录
1.现在事务B中插入一条数据(注意此时A已经开启了一个事务)
mysql当前读与快照读_第3张图片
2.再去事务查询如图,可以看到两次select的结果都没有事务B插入的id为5的记录,但是我们执行update却成功了(即可以验证update时读取当前最新的数据)
mysql当前读与快照读_第4张图片
update的过程,首先会执行当前读,然后把返回的数据加锁,之后执行update。加锁是防止别的事务在这个时候对这条记录做什么,默认加的是排他锁,也就是你读都不可以,这样就可以保证数据不会出错了。但注意一点,就算你这里加了写锁,别的事务也还是能访问的,是不是很奇怪?数据库采取了一致性非锁定读,别的事务会去读取一个快照数据。
innodb默认隔离级别是RR, 是通过MVVC来实现了,读方式有两种,执行select的时候是快照读,其余是当前读,所以,mvvc不能根本上解决幻读的情况

你可能感兴趣的:(数据库)