为何Mysql数据库上读和代码读取的数据不一致

本文探讨了一次同步删除功能实现中遇到的问题,即数据库中数据被删除后,在代码中无法查询到。问题根源在于事务隔离级别的影响。在MySQL的可重复读(REPEATABLE_READ)隔离级别下,未完成的事务内可以查看到已删除的数据。总结经验,强调了在处理跨事务操作时,理解事务隔离级别的重要性。
摘要由CSDN通过智能技术生成

上周,做了一个同步删除的功能,具体流程是,数据库删除-->调用第三方运行删除接口,同步删除。

具体流程
  • 数据库删除数据后,这里使用标志删除,再调用第三方数据。
  • 在调用第三方数据之前需要通过id查询数据,但是数据库查不到数据,把控制台答应的sql语句放在mysql执行,能查到数据。
  • 在mysql上查的数据和代码上查的数据不一致。
    分析原因
    细心的读者应该知道了,明明前面数据已经被删了,后面就查不到了。但是当时业务逻辑比较多,本地删除封装了一个方法。第三方删除又是在另外一个类里面。所以后面就没考虑到数据其实已经删除了,所以后面是查不到的。
    事务隔离级别
    但是为什么数据删除了,在mysql中还能查的到呢,这就涉及到事务的隔离级别了。spring 事务默认的隔离级别是根据使用的数据库来的,这里使用的mysql,默认隔离级别是可重复读(REPEATABLE_READ)

由于事务还没执行完,别的sql是读取不到改事务的数据改变。所以在用sql 执行 sql 是可以找到的数据的。

总结

数据库上读和代码上读取数据不一致,本质上是由于两个读取不是在同一个事务下,而不在一个事务下,使用不同的事务隔离级别,导致读取的数据也就不一致了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值