(二)MySQL事务隔离级别

学习自朱双印大佬的博客

1.四个级别

  READ-UNCOMMITTED        读未提交

       READ-COMMITTED              读已提交(MySQL默认)

  REPEATABLE-READ             可重复读(Oracle默认)

  SERIALIZABLE                      串行化

2.可重复读

事务的隔离性是通过锁来实现的,上图左边事务1执行更新语句时,应该是对数据增加了 写锁,但是在右边事务2中仍可以读数据。可是写锁是排他锁,为什么施加了写锁的同时事务2仍可以读取呢?原因是施加了"一致性非锁定读"机制来提高并发性。该机制的原理是读取时不会等锁的释放,而是读取一个快照数据。快照的实现是由事务日志所对应的undo段来完成

显然,可重复读会造成幻读,就是莫名奇妙多了一行数据。

2.串行化

事务1对表添加了写锁,事务2的查询操作会被阻塞,这就是串行化。然而数据库丧失了并发的能力,所以一般不采用这种方式。

3.读已提交(等到施加写锁的事务提交后能看到数据更改,可重复读要等到自己提交事务才能看到数据更改)

.

同样也就出现幻读的问题。除此之外,也会出现不可重读问题。不可重读不是一定不可重读,而是不一定能重读。不可重读就是数据莫名其妙被修改了。比如下图想读test数据突然就读不到了。

4.读未提交

另一个事务未提交时,就能查到数据(更改后的数据)。这叫脏读。这种方式并发性最强,但是隔离性和安全性最差。

posted @ 2020-01-13 21:21  Haolaoda  阅读(64)  评论(0)    收藏  举报