java - @Transactional 循环回滚
问题描述
使用@Transactional 时回滚事务有一些问题。我有以下代码:
@Transactional
public class A{
@Resource
Object obj;
public void insertMultiTable(){
for(Item item:items){
try{
obj.insertTableA();
obj.insertTableB();
} catch(Exception e){
// do somethings...
}
}
}
}
如您所见,我将执行 insertTableA 和 insertTableB,当两者都完成时,我的过程是成功的。我第一次和第二次都是成功的。但第三,insertTableB 会抛出异常,我只想回滚这个循环,第一次和第二次已经插入数据库。我该怎么做?请帮忙...
解决方案
将您的逻辑移动到另一个服务并用@Transactional(propagation = Propagation.REQUIRES_NEW)
它将使每个循环事务都是独立的。(IE:第三个循环抛出异常只会回滚第三个循环,让第一个和第二个循环结果提交)
public class SubA {
@Resource
Object obj;
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void insert(Item i) {
try{
obj.insertTableA();
obj.insertTableB();
} catch(Exception e){
// do somethings...
}
}
}
A
现在在您的班级中调用此服务
@Transactional
public class A{
@Resource
SubA subA;
public void insertMultiTable(){
for(Item item:items){
subA.insert(item);
}
}
}
推荐阅读
- sql - Oracle sql 获取用户在 MONDAY 字段中的值 IF TODAY 是 MONDAY
- ajax - Set-Cookie(来自 AJAX)标头未在浏览器中设置 cookie
- java - 元素此时不可点击 - 其他元素将收到点击
- angular - Angular 5 - 当用户关闭浏览器窗口时如何进行 API 调用?
- javascript - 元素的角度未定义
- javascript - onclick 链接隐藏 img 以获得相同的通知想法
- javascript - 从另一个页面重定向到革命滑块下方的锚点变低
- linux - 包括构建根的补丁
- ios - 如何在 Swift3 ios 中获取上周的日期
- android - 使用 Xamarin UiTest 启用/禁用 wifi