各位大佬,小弟最近开发的时候碰到一个很诡异的问题,如下:
首先是一个接口,这个接口里面有两个方法,分别是方法A和方法B,在方法A中使用mybatis-plus提供的批量插入API,saveOrUpdateBatch,成功批量插入了C表数据,然后在方法B中查询方法A批量插入的C表数据,发现查不到,然后拿日志打印的查询语句去数据库执行,是可以查到数据的。
之后,我尝试着在方法A中把批量插入改成for循环一个一个插入,然后方法B不变,这回就可以查询到A方法中插入的C表数据了。
事后,小弟排除了很多可能,包括方法B的查询条件是否错误,方法A批量插入的数据是否有误,包括事务配置,这些均没有发现有不对的地方,不知道是我哪里配置不对,还是mybatis-plus本身的问题。
Mybatis-Plus
Oracle
Java
继续检查事务配置,包括你程序事务设定和数据库隔离等级,这个问题大概率是A和B不在一个事务。A执行后还没有提交事务,B就执行了,所以B查不到A的。
你一个个插入,那可能就是插1个提交了一次事务,于是B就拿到了。
不确定你的具体配置,但可能有这么几个问题
1,做了主从分离,查询的时候从库还没有同步,等你复制好语句的时候从库已经同步了
2、事务,你的A方法和B方法不再同一个事务之中导致的。也可能你的A方法和B方法采用的事务策略是新建事务,导致查不到
mybatis-plus本身的问题概率不大,因为你的描述是常见需求,要出问题早出问题了。
其次,你可以吧你的代码脱敏,贴出来,大家一起集思广益。
这个是事务的部分配置,有尝试在在name="*"的那一行加上
也是不生效。
以下是相关的代码:
最外层的接口:
A方法:
B方法:
问题多半在这个listHandinMat方法里面。仔细检查代码把,多半是一些低级的问题导致的。
1、saveOrUpdateBatch(…)方法也是循环生成insert语句,你可以优化成一条insert语句(这是MyBatis优势之一)。
2、先插后查不到,不在一个session里、DB就没及时处理等有关。
3、MyBatis里的方法都是一个方法一个事务,所以,不在一个session管道里。(JPA不注解也是如此)