数据库事务隔离(详细图解!!!)

共享锁和排它锁

理解这两个锁有助于理解事务隔离的原理!!!

  • 共享锁:事务A在读数据的时候,事务B也可以读数据,但是不能写数据

  • 排它锁:事务A在写数据的时候,事务B既不能读数据,也不能写数据

Read uncommitted(读未提交)

  • 就是一个事务可以读取另一个未提交事务的数据,会导致脏读

  • 不添加任何锁

脏读:是指在一个事务处理过程里读取了另一个未提交的事务中的数据。

在这里插入图片描述
总结

  • 很明显在事务A修改数据的过程中,事务B就在进行读取数据的操作,而此时事务A还没进行提交,这就导致了脏读。

  • 当然,事务A中的修改操作可能是一系列的操作,不仅仅只是修改一个数据,也很可能是修改数据,插入数据,删除数据等等,而事务B在这个事务A的修改过程中的某个时刻读到了数据,那么这个数据很可能会出问题。

  • 就好比事务A现在有三个操作,1.查询数据,2.插入一条新数据,3.发生某种意外情况,事务A进行回滚。假设事务B在事务A执行完插入新数据的时候,刚好进行了查询,那么事务B就会查到这条事务A插入的新数据,但是事务A后来进行了回滚操作,那么事务B查到的这条数据就是有问题的,是垃圾数据。


Read committed(读已提交)

  • 就是一个事务要等另一个事务提交后才能读取数据,解决脏读,但是会导致不可重复读

  • 事务对当前被读取的数据加行级共享锁(当读到时才加锁),一旦读完该行,立即释放该行级共享锁

  • 事务在更新某数据的瞬间(就是发生更新的瞬间),必须先对其加行级排他锁直到事务结束才释放

不可重复读:是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。

第一个图
在这里插入图片描述

第二个图

在这里插入图片描述

说明

  • 第一个图:事务A在查询数据的时间段内,事务B只能进行查询操作,而不能进行修改操作。

  • 第二个图:(1)首先是事务A进行查询数据。(2)然后是事务B进行修改数据,在这期间,事务A既不能查询也不能修改。(3)最后当事务B提交完后,事务A又进行了一次查询数据。

  • 在第二个图中,两个查询的结果不一致,这就是不可重复读。


Repeatable read(可重复读)

  • 重复读,就是在开始读取数据时,不再允许修改操作,解决不可重复读,但是会导致幻读

  • 事务在读取某数据的瞬间(就是开始读取的瞬间),必须先对其加行级共享锁直到事务结束才释放

  • 事务在更新某数据的瞬间(就是发生更新的瞬间),必须先对其加行级排他锁直到事务结束才释放

幻读:是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1” 修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且 提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行 是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。幻读和不可重复读都是读取了另一 条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针 对的是一批数据整体(比如数据的个数)。

在这里插入图片描述
说明

  • 在事务A的整个过程中,事务B都无法进行数据修改,那么事务A的两次数据查询的结果肯定一致,也就解决了不可重复读。

  • 图中是演示了查询数据,其实修改数据也是同样的,当事务A在修改数据的时候,事务B只能等到事务A进行提交后才能进行操作,否则只能一直等待。


Serializable(序列化)

是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读、幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值