簡體   English   中英

特定插入的事務性回滾

[英]Transactional rollback for specific inserts

嗨,有一個要求,我正在讀取一個文件,這是文件外觀的示例

File.xls

id scode value1 value2 value3 ------依此類推

0 acdss 12 6 14 -----也不例外

1 acxx 0.14 5 12 -----例外-回滾

2 cxsas 52.2 24 21 ----也不例外

對於每一行,我必須在執行一些業務邏輯后將數據插入/更新到3個不同的表中

因此,我的插入/更新在for循環和每一行中運行。

問題是,如果將任何行的數據插入/更新到數據庫中時發生任何異常,我想回滾該特定行的所有3個表中的插入,並繼續插入其余行,如ID 0和0的文件示例中所述2也不例外,應該將數據插入所有3個表中,對於ID 1,應該回滾所有插入。 我正在對數據庫操作使用jdbcTemplate,如果我已實現的示例代碼在下面

    class writer {
    public void persistData() {
        // code to read file and created object for each table
        // size of file here is 3 so loop is running 3 times and table1Object
        // and table2Object and table3Object has rows to be inserted into
        // database table A,B,C
        for (int i = 0; i < 3; i++) {
            service.persistData(table1Object[i], table2Object[i], table3Oject[i]);

        }
    }
}

class service {
    @Transactional(propagation = Propagation.REQUIRED_NEW, readOnly = false)
    public void persistData(ob1,ob2,ob3){
        dao.insertionOrUpadteForTableA(ob1);
        dao.insertionOrUpadteForTableB(ob2);
        dao.insertionOrUpadteForTableC(ob3);

    }
}

使用這種方法,我的整個交易都會回滾,有人可以建議我如何實現這一目標。

try / catch服務調用,以便即使在發生事務錯誤的情況下也可以繼續在persistDatapersistData處理文件:

public void persistData() {
    for (int i = 0; i < 3; i++) {
       try {
           service.persistData(table1Object[i], table2Object[i], table3Oject[i]);
       } catch (TransactionException ex) {
           // handle exception
       }
    }
}

TransactionExceptionSpring Tx在數據庫事務上下文中的RuntimeException

在您的示例中,默認的事務傳播模式REQUIRED就足夠了。

class service {
    @Transactional(readOnly = false)
    public void persistData(ob1,ob2,ob3) {
        //...
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM