记录一个项目中遇到的mbatis缓存问题。
这个问题的出现很有意思,因为我们系统的插入语句用的是hibernate,修改和查询是mybatis(没有删除,删除用的是更新删除标识字段的方式)。
我的代码结构大概如下:
mainMethod(paramMap){
checkParam(paramMap);
deal(paramMap);
}
checkParam(paramMap){
查询表A;//判断某编号的数据是否存在,如果存在抛异常,不存在则继续
参数校验。。。;
}
deal(paramMap){
插入表A;
//调另一个接口做占用
occupe();
}
occupe(param){
查询表A;
参数组装;
调外系统接口;
}
结果调用的时候,占用方法中怎么也查不出来刚插入的那条数据,明明两个方法都是在一个事务里,百思不得其解,最后终于发现是因为第二次查询查了checkParam方法里的查询产生的缓存,虽然中间有一次插入语句,如果都是用的mybatis就不会有问题,插入语句会清空缓存,但是因为这里插入用的是hibernate,没有影响到mybatis的缓存,所以导致了第二次查询的幻读。emmm,这可真是个大坑呀,一开始根本没往缓存方面想,一直以为是不是事务有问题,但是也看不出事务有什么问题,回滚什么都很正常,结果竟是因为两种ORM框架混合使用带来的副作用。