乐趣区

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

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

具体流程

  • 数据库删除数据后,这里应用标记删除,再调用第三方数据。
  • 在调用第三方数据之前须要通过 id 查问数据,然而数据库查不到数据,把控制台许可的 sql 语句放在 mysql 执行,能查到数据。
  • 在 mysql 上查的数据和代码上查的数据不统一。

    剖析起因

    仔细的读者应该晓得了,明明后面数据曾经被删了,前面就查不到了。然而过后业务逻辑比拟多,本地删除封装了一个办法。第三方删除又是在另外一个类外面。所以前面就没思考到数据其实曾经删除了,所以前面是查不到的。

    事务隔离级别

    然而为什么数据删除了,在 mysql 中还能查的到呢,这就波及到事务的隔离级别了。spring 事务默认的隔离级别是依据应用的数据库来的,这里应用的 mysql,默认隔离级别是 可反复读(REPEATABLE_READ)

因为事务还没执行完,别的 sql 是读取不到改事务的数据扭转。所以在用 sql 执行 sql 是能够找到的数据的。

总结

数据库上读和代码上读取数据不统一,实质上是因为两个读取不是在同一个事务下,而不在一个事务下,应用不同的事务隔离级别,导致读取的数据也就不统一了。

退出移动版