如何解决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 举报,一经查实,本站将立刻删除。