mybatis插入语句没有清空一级缓存?两种ORM框架混合使用带来的副作用!

记录一个项目中遇到的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框架混合使用带来的副作用。

 

上一篇:laravel orm进行增删改查


下一篇:C#实现简单的ORM框架操作关系型数据库