微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Springboot / MyBatis批处理插入不会因错误而回滚甚至强制执行

如何解决Springboot / MyBatis批处理插入不会因错误而回滚甚至强制执行

我正在尝试使事务在SpringBoot + MyBatis中工作,但是无论我如何尝试,它都不会回滚。我已经将@Transactional添加到了方法中。我想念什么? 我做错了吗? flushStatements()clearCache()是否提交? sqlSession.commit()的文档显示“ flushStatements and commit”,因此似乎不应该。

try (sqlSession sqlSession = sqlSessionTemplate.getsqlSessionFactory().openSession(ExecutorType.BATCH)) {
    MyMapper1 mapper1 = sqlSession.getMapper(MyMapper1.class);
    for (int i = 0; i < results1.size(); i++) {
        mapper1.insert(results1.get(i));
        if ((i != 0 && i % BATCH_SIZE == 0) || i == results1.size()- 1) {
            sqlSession.flushStatements();
            sqlSession.clearCache();
        }
    }

    sqlSession.rollback(true); // didn't work
    int forceError = 100 / 0; // so I tried this,also didn't work

    MyMapper2 mapper2 = sqlSession.getMapper(MyMapper2.class);
    for (int i = 0; i < results2.size(); i++) {
        count = count + mapper2.insert(results2.get(i));
        if ((i != 0 && i % BATCH_SIZE == 0) || i == results2.size()- 1) {
            sqlSession.flushStatements();
            sqlSession.clearCache();
        }
    }
}

我的主要应用程序:

@SpringBootApplication
@EnableTransactionManagement
public class MyApplication extends SpringBootServletinitializer implements CommandLineRunner {
    @Autowired
    MyService service;
}

和服务类别:

@Service
public class MyService {
    public void doStuff() {
        insert();
    }

    @Transactional
    private void insert() {

解决方法

确保已在SpringBootApplication类或任何@EnableTransactionManagement类中添加了@Configuration注释。

更新(作为附加代码提供):

这应该有效

@Service
public class MyService {
    
    @Transactional // assuming this method is invoked from external code
    public void doStuff() {
        insert();
    }

    private void insert() { ... }
}

如果是从另一个注入MyService的类(@Autowired)中调用的。

@Transactional放在非公共方法上是没有用的,甚至不会发生事务包装。 Spring的呼叫需要通过代理才能正常工作。因此,该方法将需要从另一个bean调用。

在此处导航以获取有关Spring代理的更多详细信息

https://www.marcobehler.com/guides/spring-transaction-management-transactional-in-depth

https://spring.io/blog/2012/05/23/transactions-caching-and-aop-understanding-proxy-usage-in-spring

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?