背景
昨天在做项目中,有一个业务是需要先修改状态,再查询成功状态的条目,在测试中发现,一共十条数据,其中三条修改为成功状态,但是再次查询,发现三条数据为初始状态,说明没有查询到修改后的数据。
排查
这种问题一般和事务的隔离机制有关,mysql默认事务隔离级别是可重复读,事务隔离机制是作用在两个或多个事务上的,单个事务肯定是不存在隔离机制的,首先排查代码有没有开启新的事务
结果
排查中发现,其中一个方法,是复制过来的,将@Transactional注解一块复制过来的,导致修改操作开启了一个新的事务,查询操作和修改操作不在同一个事务中,而mysql默认隔离级别是可重复读,所以查询到的结果为修改前的数据。