数据库事务的隔离级别
博客专区 > Garrey 的博客 > 博客详情
数据库事务的隔离级别
Garrey 发表于6个月前
数据库事务的隔离级别
  • 发表于 6个月前
  • 阅读 9
  • 收藏 0
  • 点赞 0
  • 评论 0

【腾讯云】如何购买服务器最划算?>>>   

摘要: 数据库事务的隔离级别
  • 隔离性

        经常会遇到事务的并发执行,并发的事务是互相隔离开的,一个事务的执行不会被其他事务的执行干扰。也就是说,不同的事务操作相同的数据时,每个事务都会有各自完整的数据空间,即一个事务内部的操作及使用的数据对其他的事务来言是隔离的,并发执行的各个事务之间不能互相干扰。

        标准SQL规范中,定义了四个隔离级别,不同的隔离级别对事务的处理不同。四种隔离级别:        1.未授权读 2.授权读 3.可重复读 4.串行化 。

  • 未授权读(读未提交)

        未授权读,Read Uncommitted也称为读未提交,是最低的隔离级别,此隔离级别会发生脏读

        比如事务A正在对mysql数据库中的某一数据data进行更新操作,假设事务A后续还有一些操作,所以事务A还未提交,,此时有个新事务B进来了,事务B可以访问该数据data,也就是事务B能读到事务A还未提交的数据。比data初始值是0,此时事务A和事务B同时来,事务A对data进行加法操作,递增加+1直到data=10,事务B能够看到data从0、1、2、3......、10当中的所有值,对data出现的这一系列值的读取就是读未提交的数据。

  • 授权读(读已提交)

        Read Committed,理解了读未提交,那么读已提交就很好理解了,只读取已经被事务提交的数据,不会读到未提交的数据,比读未提交隔离级别高。比如事务A也是对data进行+1操作,相当于事务A对data上了锁,其他的事务暂时不能访问,等到提交事务后,释放掉锁,事务B去读data也就只能读到data=10这个已经提交的数据。

        读已提交会出现不可重复读,不可重复读的意思就是,在同一个事务中读取同一条数据的可能不一致。例如:事务B先对读取到data是0,事务B进行一些其他操作C,事务B还未提交,此时事务A对data进行+1更新操作,事务A已提交,事务B操作C完成后,需要再次读取data,此时读取的值为10。事务B在一次事务中对data两次读取出现了不一样的值,就是不可重复读

        出现不可重复读的原因是由于update操作引起的,在一个事务中的两次读取之间另一个事务进行update操作就会产生不可重复读。

  • 可重复读

        Repeatable Read,可重复读取,比读已提交隔离级别高。针对上面的例子出现了不可重复读的情况,采用这个可重复读的隔离级别能够使,事务B在一次事务中多次读取到data的值都是同一个,同时也可以防止脏读。但是可重复读也会出现幻读。幻读主要发生的原因是insert和delete的操作导致的。

        事务A读取表中满足条件的数据集结果有10条,事务B在表中新增(删除)一个数据,新增的数据也满足事务A的读取条件,此时事务A又去读结果有11条(9条)。

  • 串行化

        Serializable串行化操作,最严格的隔离级别,也就是让事务一个一个地执行,不能并发执行。这种事务隔离级别性能很低,因为同时只有一个事务执行,并发量较大时,会出现许多超时情况

    

总结:四种隔离级别会产生如下问题

        

共有 人打赏支持
粉丝 0
博文 7
码字总数 6500
×
Garrey
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: