瀏覽代碼

删除批量操作多余代码,并修改为强制rollback/commit

1. 批量操作方法内,从TransactionSynchronizationManager获取到的sqlSession
和后启的batch模式的sqlSession完全是两个sqlSession实例。

不需要手动提交先前由TransactionSynchronizationManager绑定到本地线程的sqlSession,
因为它的commit/rollback/close等操作完全由创建它的对象来完成,一般是SqlSessionTemplate.SqlSessionInterceptor。

2. 后起的sqlSession的commit/rollback参数应该是true,在spring托管事务的情况下这里的强制提交即便是true也会被忽略,也就是不会进行事务的提交,真正的事务统一由spring事务管理器来处理。但是还需要考虑到非spring托管事务的情况。
“gjcg123123 3 年之前
父節點
當前提交
6a9806af34

+ 3 - 14
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/toolkit/SqlHelper.java

@@ -153,25 +153,14 @@ public final class SqlHelper {
     @SneakyThrows
     public static boolean executeBatch(Class<?> entityClass, Log log, Consumer<SqlSession> consumer) {
         SqlSessionFactory sqlSessionFactory = sqlSessionFactory(entityClass);
-        SqlSessionHolder sqlSessionHolder = (SqlSessionHolder) TransactionSynchronizationManager.getResource(sqlSessionFactory);
-        boolean transaction = TransactionSynchronizationManager.isSynchronizationActive();
-        if (sqlSessionHolder != null) {
-            SqlSession sqlSession = sqlSessionHolder.getSqlSession();
-            //原生无法支持执行器切换,当存在批量操作时,会嵌套两个session的,优先commit上一个session
-            //按道理来说,这里的值应该一直为false。
-            sqlSession.commit(!transaction);
-        }
         SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
-        if (!transaction) {
-            log.warn("SqlSession [" + sqlSession + "] Transaction not enabled");
-        }
+
         try {
             consumer.accept(sqlSession);
-            //非事物情况下,强制commit。
-            sqlSession.commit(!transaction);
+            sqlSession.commit(true);
             return true;
         } catch (Throwable t) {
-            sqlSession.rollback();
+            sqlSession.rollback(true);
             Throwable unwrapped = ExceptionUtil.unwrapThrowable(t);
             if (unwrapped instanceof PersistenceException) {
                 MyBatisExceptionTranslator myBatisExceptionTranslator