spring事务,在循环中update出现异常回滚问题?

在一个有事务的方法中通过读取表记录集合,循环update或save字段值,每更新一个普通账户都要更新一次管理账户,
所以要重新查询系统账户

@Transactional(rollbackFor = Exception.class)
public int test4()  {
    int  r= 0;
    for (int i = 0; i<10; i++) {
        try {
            //查询管理账户
            SystemAccout systemAccout = gaodeMapper.getSysAccout(1);

            //普通账户
            Gaode gao = new Gaode();
            gao.setId(i);
            gao.setAddrName("testException-save-one " + i);
            gao.setPoint(systemAccout.getPoint());
            gao.setBal(systemAccout.getBal());
            r = gaodeMapper.updateUser(gao);
            if(r > 0) {
                //假设更新到第五条出现异常,只需回滚本次循环的所有update 或 save操作记录,继续执行不中断循环
                if(i == 5) {
                    throw new RuntimeException();
                }
                //更新管理账户
                SystemAccout sys = new SystemAccout();
                sys.setId(1);
                sys.setPoint(systemAccout.getPoint() - ThreadLocalRandom.current().nextInt(10, 100));
                gaodeMapper.updateSystemAccoutn(sys);

            }
        }catch (Exception e) {
            throw e;
        }
    }
    return r;
}

不知各位老师在项目中遇到这种情况怎么处理的?
这种通过读取到一个集合然后遍历update或save的方法还有什么好方案代替呢?

阅读 4.7k
1 个回答
新手上路,请多包涵

可以参考下spring事务的传播属性来解决这个问题, for循环内调用一个新方法处理这一条数据,并在方法上标注 @Transactional(propagation = Propagation.REQUIRES_NEW) 用来新开启一个事务。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题