【数据库】事务的四种隔离级别

学习之前要先了解,什么叫脏读、幻读和不可重复读

读未提交(read uncommit)(ru)

也就是说在一个事务还没有提交的时候,别的事务有可能读到这个未提交事务的数据

        比如事务1 将A的存款从700改成1000,事务1还没有提交的时候事务2读取到了事务1提交的1000,但是事务1发生了错误进行回滚,导致A的存款还是700,但是事务2认为A的存款是1000,就产生了脏读

读已提交(read commit)(rc)

也就是说一个事务提交以后才有可能被其他事物读到

        比如程序员拿着信用卡去享受生活(卡里当然是只有3.6万),当他埋单时(程序员事务开启),收费系统事先检测到他的卡里有3.6万,就在这个时候!!程序员的妻子要把钱全部转出充当家用,并提交。当收费系统准备扣款时,再检测卡里的金额,发现已经没钱了(第二次检测金额当然要等待妻子转出金额事务提交完)。

这时候就出现了不可重复读的情况,oracle就是用的这种情况

可重复读(repeatable read)(rr)

就是在开始读取数据时,不再允许修改操作

        程序员拿着信用卡去享受生活(卡里当然是只有3.6万),当他埋单时(事务开启,不允许其他事务的UPDATE修改操作),收费系统事先检测到他的卡里有3.6万。这个时候他的妻子不能转出金额了。接下来收费系统就可以扣款了。

但是会出现幻读问题

也就是程序员某一天去消费,花了2千元,然后他的妻子去查看他今天的消费记录(全表扫描FTS,妻子事务开启),看到确实是花了2千元,就在这个时候,程序员花了1万买了一部电脑,即新增INSERT了一条消费记录,并提交。当妻子打印程序员的消费记录清单时(妻子事务提交),发现花了1.2万元,似乎出现了幻觉,这就是幻读。

这个地方个人理解是,程序员买单的事务,可以拆分为查询余额,扣除余额之前查询余额,扣除余额,这里是进行更新操作,别的事务在这个时候不能进行修改,但是在进行查询记录的时候,因为过程时查询,打印之前在查询,只有select,没有update,所以会程序员消费相当于增加一条记录,就会产生幻读

序列化(serializable)

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

参考文章

事务的四种隔离级别_逐梦追风_博客-CSDN博客

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值