某业务方法上存在 spring 事务注解 @Transactional,在该方法中有两条 dao 调用,即两条 sql 语句,操作的是同一张表,如果先执行 insert 语句,再执行 select 语句,会出现这样的问题:即我们原本认为数据库本身是空值的,但是 select 语句查询出来的是有值的,然而当我们实际去使用日志打印的 sql 去查询数据库时,其实是没有值的,这个是因为事务控制 + mybatis session 导致的原因,其实还没有真实插入一条数据到数据库中时,已经存在一条记录保存在 mybatis 的 session 中,下次执行 select 语句会带出 session 中的记录
在 for 循环中执行 select 语句,如果两次执行语句一样,且启动了 mybatis 二级缓存,那么如果你对之前第一条执行的语句返回的对象进行操作(如重新为某个属性赋值)的话,会导致第二条语句返回的对象不正确,实际上第二条数据库查询语句没有真正执行,而是从缓存中读取第一条执行后返回的对象,因为第一条语句返回的对象被手动修改,所以导致第二次的返回对象有问题。