鍍金池/ 問答/Java  數(shù)據(jù)庫(kù)/ spring事務(wù),在循環(huán)中update出現(xiàn)異?;貪L問題?

spring事務(wù),在循環(huán)中update出現(xiàn)異常回滾問題?

在一個(gè)有事務(wù)的方法中通過讀取表記錄集合,循環(huán)update或save字段值,每更新一個(gè)普通賬戶都要更新一次管理賬戶,
所以要重新查詢系統(tǒng)賬戶

@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) {
                //假設(shè)更新到第五條出現(xiàn)異常,只需回滾本次循環(huán)的所有update 或 save操作記錄,繼續(xù)執(zhí)行不中斷循環(huán)
                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;
}

不知各位老師在項(xiàng)目中遇到這種情況怎么處理的?
這種通過讀取到一個(gè)集合然后遍歷update或save的方法還有什么好方案代替呢?

回答
編輯回答
夢(mèng)一場(chǎng)

可以參考下spring事務(wù)的傳播屬性來解決這個(gè)問題, for循環(huán)內(nèi)調(diào)用一個(gè)新方法處理這一條數(shù)據(jù),并在方法上標(biāo)注 @Transactional(propagation = Propagation.REQUIRES_NEW) 用來新開啟一個(gè)事務(wù)。

2018年3月12日 15:52