事务三大问题的解决方案

什么是事务?

事务是很多个SQL操作的总和,一个事务内部的操作要么一起成功、要么一起失败。

事务的四大隔离级别和三大问题

四大隔离级别

  1. 读未提交:事务A未提交事务,在事务A中能看到 事务B 未提交事务修改的数据

  2. 读提交:事务A未提交事务,在事务A中能看到 事务B 提交事务后发生变动的数据,可能在事务A中不希望能看到在操作时数据被修改

  3. 可重复读:指一个事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致

  4. 串行化:事务A未提交之前,事务B不允许修改数据,事务B会被阻塞,直到事务A提交事务

三大问题

由于MySQL支持多个客户端同时连接,在并发事务的时候就会出现问题

  1. 脏读:读到了其他未提交的事务修改的结果

  2. 不可重复读:同一条select语句前后的结果数据不一致

  3. 幻读:同一条select语句前后的结果条数不一致

脏读不可重复读幻读
读未提交
读已提交×
可重复读××
串行化×××

三大问题的解决方案

脏读

其实一般来说,用到的隔离级别至少是读已提交RC,或者是可重复读RR,基本是没有脏读的问题的

不可重复读

前面也提到了,不可重复读表现是:同一条select语句前后的结果数据不一致。

  • 可行的解决方案,最简单的就是把隔离级别提升到可重复读RR,或者串行化(不推荐)

  • 那如果不想动隔离级别怎么办呢?那就可以考虑加锁(select ... in share mode、select ... for update),无论是共享锁或者是独占锁,都会对写操作互斥,那么就可以保证不会出现不可重复读这个问题了

幻读

幻读表现是:同一条select语句前后的结果条数不一致。

  • 可行的解决方案,最简单的就是把隔离级别提升到串行化(不推荐)

  • 那如果不想动隔离级别怎么办呢?那就同样可以考虑加锁(select ... in share mode、select ... for update),无论是共享锁或者是独占锁,都会对写操作互斥,那么就可以保证不会出现幻读这个问题了

  • 对于Innodb引擎其实还有一个方案,在可重复读的隔离级别下,通过MVCC可以很大可能的不出现幻读(但是如果先用快照读,期间其它事务插入新数据,再用当前读,是有可能发生幻读的)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值