spring设置手动回滚不生效(setRollbackOnly),数据还是入库了。

spring设置手动回滚不生效(setRollbackOnly),数据还是入库了,代码如下。

@Transactional
  public void executeDataMigration() {
    try {
      for (int i = 1; i < 10; i++) {
        insertA(i);
      }

    } catch (Exception e) {
      TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
    }
  }

  public void insertA(int id) {
    String sql = "insert tableA(id, code, name) values (?, ?, ?)";
    dao.executeBySql(sql, new Object[] {id, "123", "小花"});
    String a = null;
    a.toString();
  }

上面代码,捕获异常后加了手动回滚,结果数据还是入库了,请问应该怎么写,才能让数据insertA发生错误后回滚,但是又不能影响for循环的下一次执行。

比如我要循环10次,有2次失败,8次成功,那么数据库的最终数据要为8条,请问怎么能做到呢。

wearefamulei
wearefamulei 哪位好心人帮我看看,头都快想秃了
4 个月之前 回复

1个回答

开启@EnableAspectJAutoProxy(exposeProxy = true)

AopContext.currentProxy()).insertA();

可以参考https://www.cnblogs.com/nxzblogs/p/10503889.html

wearefamulei
wearefamulei 所以我重新建了一个service,把insertA()方法移到这个service中,并设置Propagation.REQUIRES_NEW,也可以达到一样的效果。
4 个月之前 回复
wearefamulei
wearefamulei 看到你给的链接里面说到,spring是通过代理代管理事务的,同一个service内方法调用方法,被调用方的事务会延续调用方的事务,而不会新开一个事务。
4 个月之前 回复
wearefamulei
wearefamulei 这个方法可以的,不过按你这里的例子,我这里还需要给insertA()方法添加事务,并设置传播行为REQUIRES_NEW。
4 个月之前 回复
wearefamulei
wearefamulei 谢谢,我试试
4 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问