四种事务隔离级别
事务会产升的问题:
- 脏读:读到其他事务未提交的数据
- 不可重复读:一个事务里多次针对同数据源的查询不一样
- 幻读:事务前后针对同一数据源的范围查询的结果条数不一样
查看隔离级别:
select @@TRANSACTION_ISOLATION;
set global TRANSACTION ISOLATION LEVEL
读未提交
读的时候不加锁,也不使用MVCC,能直接读到最新数据,update时加记录锁,事务问题最多
读已提交
读的时候有快照读和当前读,快照读使用MVCC,每次快照读都产生新的readview,读的是最新提交的数据
不算脏数据,解决了脏读。update只会加记录锁。
可重复读
读的时候跟读已提交差不多,区别是只在第一次快照读时生成readview,后面会复用,解决不可重复读。
update会加间隙锁和临键锁。
序列化
读和写都加锁,读都是当前读
RR解决了大部分情况下的幻读
快照读通过MVCC
RR的快照读只会生成一次readview,那么该事务中途有其他事务插入数据,对当前事务是不可见的,
即避免了幻读
当前读通过加锁
当前读select…for upate会通过加临键锁的方式阻塞其他事务想往锁范围的数据插入数据,直到当前事务
提交结束
但有两种特殊情况
1.当前事务去主动更新“不存在”的记录(这里的不存在指的是对当前事务不存在,其实其他事务已经插入
进来了),然后这条记录就对当前事务可见,于是发生了幻读
2.快照读,然后当前读
RR没解决部分情况下的可重复读
第一次快照读,第二次当前读