码迷,mamicode.com
首页 > 其他好文 > 详细

事务的隔离性分析

时间:2019-08-17 01:21:27      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:重复   bestv   抽象   通过   更新   之间   mvc   innodb   table   

关键字:隔离性、幻读、间隙锁


 
1、并发的事务之间是互不干扰的,它们之间是隔离进行。这是事务的隔离性的体现。
 
2、事务的四种隔离级别&&三种问题:
(1)四种隔离级别:读未提交、读提交、可重复读、串行化
(2)三种问题: 脏读、不可重复读、幻读

3、对比分析:
(1)可重复读&&不可重复读:
  可重复读:指的是一个事务可以读取其他事务的更新,但是第一次读取到的数据,就算下次读取别的事务时,该事务已经对这个数据进行更新了,当前事务还是保持第一次读取的那个数据,也就可以抽象认为可以重复读到相同的数据。在这个隔离级别之下,只有当前事务提交之后,才能够读取到其他事务的提交。(冲突就发生在这个时刻)
 
  不可重复读:指的是数据不可重复读,别的事务一旦更新了这个数据,那么当前事务也需要更新这个数据,不可以再读到之前的那个数据。在同一个事务中,两次读取的数据不一致。
 
对比:
  ①可重复读时隔离级别;  不可重复读是一种现象;
  ②对于可重复读:当前事务未提交时,不可以读取到其他事务的commit,只能重复读取第一次读取的commit的内容;
   对于不可重复读:当前事务未提交时,可以读取到其他事务的commit,每次都是读取到别的事务最新提交的内容;
 
(2)Repeatable Read && 幻读:
 
  数据库的四种隔离级别在不同数据库中的实现是不同的,在mysql中,在实现Repeatable Read这个隔离级别的时候,已经解决了幻读的问题了。(虽然SQL标准中没有要求解决幻读,但是innodb中解决了)
 
怎样解决幻读?
  ①对于更新操作,都会加X锁,所以别的事务没办法进行更新操作,所以不会出现幻读;
  ②但是对于读操作:innodb默认不会加S锁,采用MVCC(等价于读锁)进行控制,同时添加了间隙锁(gap锁)。
   (“间隙锁”分析:https://www.cnblogs.com/bestvish/p/10518553.html
 
(3)innodb下的Repeatable Read和串行化的区别:
  前提:假设有两个并发事务A、B:
  ①RR隔离级别:
    a、事务A写,会加X锁,事务B只能读;
    b、事务A读,对于当前读的记录,通过MVCC进行控制,对当前记录的间隙加gap锁(等价于S锁)。此时事务B没办法写,只能读。
  ②串行化级别:不管是读还是写,都是串行化的,在某个事务读或者写的时候,别的事务是没办法读或者写的。
 

事务的隔离性分析

标签:重复   bestv   抽象   通过   更新   之间   mvc   innodb   table   

原文地址:https://www.cnblogs.com/axing-articles/p/11366890.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!