(二)MySQL事务隔离级别
学习自朱双印大佬的博客
1.四个级别
READ-UNCOMMITTED 读未提交
READ-COMMITTED 读已提交(MySQL默认)
REPEATABLE-READ 可重复读(Oracle默认)
SERIALIZABLE 串行化
2.可重复读
事务的隔离性是通过锁来实现的,上图左边事务1执行更新语句时,应该是对数据增加了 写锁,但是在右边事务2中仍可以读数据。可是写锁是排他锁,为什么施加了写锁的同时事务2仍可以读取呢?原因是施加了"一致性非锁定读"机制来提高并发性。该机制的原理是读取时不会等锁的释放,而是读取一个快照数据。快照的实现是由事务日志所对应的undo段来完成。
显然,可重复读会造成幻读,就是莫名奇妙多了一行数据。
2.串行化
事务1对表添加了写锁,事务2的查询操作会被阻塞,这就是串行化。然而数据库丧失了并发的能力,所以一般不采用这种方式。
3.读已提交(等到施加写锁的事务提交后能看到数据更改,可重复读要等到自己提交事务才能看到数据更改)
.
同样也就出现幻读的问题。除此之外,也会出现不可重读问题。不可重读不是一定不可重读,而是不一定能重读。不可重读就是数据莫名其妙被修改了。比如下图想读test数据突然就读不到了。
4.读未提交
另一个事务未提交时,就能查到数据(更改后的数据)。这叫脏读。这种方式并发性最强,但是隔离性和安全性最差。