mybatis-plus icon indicating copy to clipboard operation
mybatis-plus copied to clipboard

saveBatch下的事务问题

Open haoxz11 opened this issue 2 years ago • 6 comments

当前使用版本(必填,否则不予处理)

3.5.2

该问题是如何引起的?(确定最新版也有问题再提!!!)

当调用IService下的saveBatch最终会调用SqlHelper.executeBatch方法,

方法中会调用sqlSession先提交一下

SqlSessionHolder sqlSessionHolder = (SqlSessionHolder) TransactionSynchronizationManager.getResource(sqlSessionFactory);
        boolean transaction = TransactionSynchronizationManager.isSynchronizationActive();
        if (sqlSessionHolder != null) {
            SqlSession sqlSession = sqlSessionHolder.getSqlSession();
            //原生无法支持执行器切换,当存在批量操作时,会嵌套两个session的,优先commit上一个session
            //按道理来说,这里的值应该一直为false。
            sqlSession.commit(!transaction);
        }

虽然是非强制提交,但是,如果saveBatch上面有insert/update等操作,这个时候如果这个方法体是外包一层事务,那么insert、update会被实际执行;后续如果saveBatch报错啥的,无法回滚;

重现步骤(如果有就写完整)

@Transactional(rollbackFor = Exception.class)
public Response<Void> addData(List<Abc> list) {
     service.save(new Abc());
     service.saveBatch(list);
     throw new Exception();
}

报错信息

haoxz11 avatar Feb 06 '23 04:02 haoxz11

我也遇到这个问题了

zengzehao avatar May 08 '23 09:05 zengzehao

有下文吗

caztg avatar Aug 22 '23 03:08 caztg

我也遇到了

Stephenzho avatar Nov 29 '23 10:11 Stephenzho

https://github.com/baomidou/mybatis-plus/issues/4893

lutao043 avatar May 21 '24 06:05 lutao043