事务并发会出现的问题:脏读,幻读 ,不可重复读 以及解决方法:四个隔离级别

 记忆小窍门:

先记住三个会出现的问题:脏读,不可重复读,幻读(顺序不能记错)

读未提交,三个问题一个问题都没解决

读已提交解决了第一个问题脏读

可重复读解决了第二个问题不可重复读

序列化解决了第三个问题幻读

读未提交  隔离级别  允许事务读取其他事务未提交的数据

读已提交 隔离级别 事务只能读取其他事务已经提交的数据

可重复读 MySQL InnoDB 引擎的默认隔离级别

串行化  串行化使得事务与事务之间不能再并发,性能极低

 

MySQL 服务器是允许多个客户端连接的,这意味着 MySQL 需要同时处理多个事务的情况,多个事务并发会出现的问题:

脏读:某一个事务,读取了另外一个事务未提交的数据。

事务2就读取了事务1未提交的数据,而且事务1后来执行失败,回滚了

image

幻读:某一个事务,对同一个表前后查询到行数不一致

事务2刚开始的时候查询到的是3行,后面查询到的是4行,行数不一致

看到之前没看到的行或者之前看到的行现在没有了,就是“幻”的意思

 不可重复读:某一个事务,对同一个数据前后读取到的结果不一致

事务2前后读取到的数就不一样

总结:

脏读:读到其他事务未提交的数据

幻读:前后读取的记录数量(行数)不一致

不可重复读:前后读取的数据(数据的值)不一致

有四种隔离级别来规避这三种现象,隔离级别越高,性能效率就越低

读未提交(read uncommitted,指一个事务还没提交时,它做的变更就能被其他事务看到,也就是说这个级别下,允许事务读取其他事务未提交的数据

读已提交(read committed,指一个事务提交之后,它做的变更才能被其他事务看到,这个级别下,事务只能读取其他事务已经提交的数据

可重复读(repeatable read,指一个事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,在这个级别下,事务对同一个字段的多次读取结果都是一致的(除非数据十是被本身修改了)MySQL InnoDB 引擎的默认隔离级别

串行化(serializable );会对记录加上读写锁,在多个事务对这条记录进行读写操作时,如果发生了读写冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行,比如说事务A启动,不管事务A对age作任何操作,事务B想访问age都需要排队,只有等事务A结束了,才能去访问age,也就是说,这个级别下事务依次执行,串行化使得事务与事务之间不能再并发,性能极低

四个级别:串行化>可重复读>读已提交>读未提交

各个隔离级别下可能发生的现象不同:

所以,要解决脏读现象,就要升级到「读未提交」以上的隔离级别;要解决不可重复读现象,就要升级到「可重复读」的隔离级别,但是要解决幻读现象并不建议隔离级别升级到「串行化」,因为在「可重复读」隔离级别下,通过mvcc,可以很大程度上避免幻读现象的发生(注意是很大程度避免,并不是彻底避免),所以 MySQL 并不会使用「串行化」隔离级别来避免幻读现象的发生,因为使用「串行化」隔离级别会影响性能。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值