文章总结来自孤独烟,打杂的ZRJ,顺便盗几个图
事务隔离分四级:分别为
1:读未提交:就是一个事务检索的数据被另一个未提交的事务修改了,就是说检索数据时不可靠的,会被另一个还没提交的事务修改了数据————>出现脏读的可能
2:读已提交:就是一个事务检索的数据被另一个已经提交了的事务修改了,也叫做不可重复读,这里说的数据更是指主键索引没改,但是主键索引指向的数据内容变了,
如果是增加或者删除一条数据,则不属于不可重复读--------------->出现不可重复读的可能
可以看得出发生脏读是不可重复读的子集,发生脏读必然不可重复读也发生了,所以读未提交会产生脏读,不可重复读的可能,也就是说读未提交会产生不可重复读
3:可重复读:对幻读的解释:基于不可重复读,一个事务对检索的数据,被另一个已经提交的事务修改了,而这中修改是对行的修改,增加或者删除,这种就属于幻读
所以就可以看出,不可重复读是幻读的子集,就是说发生不可重复读属于幻读的一种,就是说幻读除了是对数据行的增加或者减少,
还可能是对某个索引值的内容的改变
但是,dance,可重复读不能解决幻读的情况
要解决幻读需要在REPEtable read 隔离级别下,该隔离级别可以保证不出现不可重复读和读脏的情况,弹药保证幻读还需要加锁lock next-key
就是要在查询是加上select * from tableA lock in share mode
4:而序列化就简单了,就是在可重复读的情况下加上lock in share mode
放图震慑
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交 | 是 | 是 | 是 |
不可重复读 | 否 | 是 | 是 |
可重复读 | 否 | 否 | 是 |
串行化 | 否 | 否 | 否 |