上周实现了同步删除功能。具体流程是,数据库删除-->调用第三方操作删除接口同步删除。具体进程数据库中删除数据后,通过flag删除,再调用第三方数据。在调用第三方数据之前,需要通过id查询数据,但是数据库找不到数据,在mysql中执行控制台承诺的sql语句,可以找到数据。mysql上查的数据和code上查的数据不一致。仔细分析原因的读者应该知道,之前的数据都被删除了,以后就找不到了。但是当时业务逻辑比较多,封装了一个本地删除的方法。第三方删除是另一类。所以我没有考虑到后来数据实际上已经被删除了,所以后来就找不到了。事务隔离级别但是为什么数据被删除了,在mysql中还是可以查到的,这就涉及到事务的隔离级别。spring事务的默认隔离级别基于所使用的数据库。这里使用的mysql,默认的隔离级别是可重复读(REPEATABLE_READ)。由于事务还未执行,其他SQL无法读取到被变更事务的数据变化。所以用sql执行sql就可以查到数据。总结一下,在数据库上读取和在代码上读取不一致,本质上是因为两次读取不在同一个事务下,而是不在同一个事务下,使用了不同的事务隔离级别,导致数据读取不一致。
