亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

UnexpectedRollbackException解決方案

mating / 4359人閱讀

摘要:在嵌套事務(wù)場景中,內(nèi)層事務(wù)的和外層事務(wù)的會在外層事務(wù)結(jié)束時進行提交或回滾。解決方案如果希望內(nèi)層事務(wù)拋出異常時中斷程序執(zhí)行,直接在外層事務(wù)的代碼塊中拋出如果希望程序正常執(zhí)行完畢,并且希望外層事務(wù)結(jié)束時全部提交,需要在內(nèi)層事務(wù)中做異常捕獲處理。

前言

最近在項目中發(fā)現(xiàn)了一則報錯:“org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only”。根據(jù)報錯信息來看是spring框架中的事務(wù)管理報錯:事務(wù)回滾了,因為它被標記為回滾狀態(tài)。

報錯原因

多層嵌套事務(wù)中,如果使用了默認的事務(wù)傳播方式,當內(nèi)層事務(wù)拋出異常,外層事務(wù)捕捉并正常執(zhí)行完畢時,就會報出rollback-only異常。
spring框架是使用AOP的方式來管理事務(wù),如果一個被事務(wù)管理的方法正常執(zhí)行完畢,方法結(jié)束時spring會將方法中的sql進行提交。如果方法執(zhí)行過程中出現(xiàn)異常,則回滾。spring框架的默認事務(wù)傳播方式是PROPAGATION_REQUIRED:如果當前沒有事務(wù),就新建一個事務(wù),如果已經(jīng)存在一個事務(wù)中,加入到這個事務(wù)中。
在項目中,一般我們都會使用默認的傳播方式,這樣無論外層事務(wù)和內(nèi)層事務(wù)任何一個出現(xiàn)異常,那么所有的sql都不會執(zhí)行。在嵌套事務(wù)場景中,內(nèi)層事務(wù)的sql和外層事務(wù)的sql會在外層事務(wù)結(jié)束時進行提交或回滾。如果內(nèi)層事務(wù)拋出異常e,在內(nèi)層事務(wù)結(jié)束時,spring會把事務(wù)標記為“rollback-only”。這時如果外層事務(wù)捕捉了異常e,那么外層事務(wù)方法還會繼續(xù)執(zhí)行代碼,直到外層事務(wù)也結(jié)束時,spring發(fā)現(xiàn)事務(wù)已經(jīng)被標記為“rollback-only”,但方法卻正常執(zhí)行完畢了,這時spring就會拋出“org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only”。
代碼示例如下:

Class ServiceA {
    @Resource(name = "serviceB")
    private ServiceB b;
    
    @Transactional
    public void a() {
        try {
            b.b()
        } catch (Exception ignore) {
        }
    }
}

Class ServiceB {
    @Transactional
    public void b() {
        throw new RuntimeException();
    }
}

當調(diào)用a()時,就會報出“rollback-only”異常。

解決方案

如果希望內(nèi)層事務(wù)拋出異常時中斷程序執(zhí)行,直接在外層事務(wù)的catch代碼塊中拋出e.

如果希望程序正常執(zhí)行完畢,并且希望外層事務(wù)結(jié)束時全部提交,需要在內(nèi)層事務(wù)中做異常捕獲處理。

如果希望內(nèi)層事務(wù)回滾,但不影響外層事務(wù)提交,需要將內(nèi)層事務(wù)的傳播方式指定為PROPAGATION_NESTED。注:PROPAGATION_NESTED基于數(shù)據(jù)庫savepoint實現(xiàn)的嵌套事務(wù),外層事務(wù)的提交和回滾能夠控制嵌內(nèi)層事務(wù),而內(nèi)層事務(wù)報錯時,可以返回原始savepoint,外層事務(wù)可以繼續(xù)提交。

在我的項目中之所以會報“rollback-only”異常的根本原因是代碼風格不一致的原因。外層事務(wù)對錯誤的處理方式是返回true或false來告訴上游執(zhí)行結(jié)果,而內(nèi)層事務(wù)是通過拋出異常來告訴上游(這里指外層事務(wù))執(zhí)行結(jié)果,這種差異就導致了“rollback-only”異常。雖然最后事務(wù)依然是回滾了,不影響程序?qū)ql的處理,但外層事務(wù)的上游本期望返回true和false,卻收到了UnexpectedRollbackException異常,(╯ ̄Д ̄)╯︵ ┻━┻。

附:事務(wù)傳播方式

@see org.springframework.transaction.annotation.Propagation

事務(wù)傳播方式 說明
PROPAGATION_REQUIRED 如果當前沒有事務(wù),就新建一個事務(wù),如果已經(jīng)存在一個事務(wù)中,加入到這個事務(wù)中。這是默認的傳播方式
PROPAGATION_SUPPORTS 支持當前事務(wù),如果當前沒有事務(wù),就以非事務(wù)方式執(zhí)行
PROPAGATION_MANDATORY 使用當前的事務(wù),如果當前沒有事務(wù),就拋出異常
PROPAGATION_REQUIRES_NEW 新建事務(wù),如果當前存在事務(wù),把當前事務(wù)掛起
PROPAGATION_NOT_SUPPORTED 以非事務(wù)方式執(zhí)行操作,如果當前存在事務(wù),就把當前事務(wù)掛起
PROPAGATION_NEVER 以非事務(wù)方式執(zhí)行,如果當前存在事務(wù),則拋出異常
PROPAGATION_SUPPORTS 支持當前事務(wù),如果當前沒有事務(wù),就以非事務(wù)方式執(zhí)行。
PROPAGATION_NESTED 如果當前存在事務(wù),則在嵌套事務(wù)內(nèi)執(zhí)行。如果當前沒有事務(wù),則執(zhí)行與PROPAGATION_REQUIRED類似的操作。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/77135.html

相關(guān)文章

  • CSS三欄布局——多種方法詳解,比較兼容性

    摘要:題目假設(shè)高度已知,請寫出三欄布局,其中左欄右欄寬度各為,中間自適應(yīng)三欄布局的種方案這是一道經(jīng)典的面試題,下面記錄了布局的種方法。 題目:假設(shè)高度已知,請寫出三欄布局,其中左欄、右欄寬度各為300px,中間自適應(yīng). 三欄布局的5種方案 這是一道經(jīng)典的面試題,下面記錄了css布局的5種方法。 三欄布局 * { margin: 0; ...

    馬忠志 評論0 收藏0
  • 實現(xiàn)三欄布局的幾種方法

    摘要:前言三欄布局,顧名思義就是兩邊固定,中間自適應(yīng)。三欄布局在實際的開發(fā)十分常見,比如淘寶網(wǎng)的首頁,就是個典型的三欄布局即左邊商品導航和右邊導航固定寬度,中間的主要內(nèi)容隨瀏覽器寬度自適應(yīng)。但網(wǎng)格布局的兼容性不好。 前言 三欄布局,顧名思義就是兩邊固定,中間自適應(yīng)。三欄布局在實際的開發(fā)十分常見,比如淘寶網(wǎng)的首頁,就是個典型的三欄布局:即左邊商品導航和右邊導航固定寬度,中間的主要內(nèi)容隨瀏覽器寬...

    golden_hamster 評論0 收藏0
  • 實現(xiàn)三欄布局的幾種方法

    摘要:前言三欄布局,顧名思義就是兩邊固定,中間自適應(yīng)。三欄布局在實際的開發(fā)十分常見,比如淘寶網(wǎng)的首頁,就是個典型的三欄布局即左邊商品導航和右邊導航固定寬度,中間的主要內(nèi)容隨瀏覽器寬度自適應(yīng)。但網(wǎng)格布局的兼容性不好。 前言 三欄布局,顧名思義就是兩邊固定,中間自適應(yīng)。三欄布局在實際的開發(fā)十分常見,比如淘寶網(wǎng)的首頁,就是個典型的三欄布局:即左邊商品導航和右邊導航固定寬度,中間的主要內(nèi)容隨瀏覽器寬...

    IamDLY 評論0 收藏0
  • 實現(xiàn)三欄布局的幾種方法

    摘要:前言三欄布局,顧名思義就是兩邊固定,中間自適應(yīng)。三欄布局在實際的開發(fā)十分常見,比如淘寶網(wǎng)的首頁,就是個典型的三欄布局即左邊商品導航和右邊導航固定寬度,中間的主要內(nèi)容隨瀏覽器寬度自適應(yīng)。但網(wǎng)格布局的兼容性不好。 前言 三欄布局,顧名思義就是兩邊固定,中間自適應(yīng)。三欄布局在實際的開發(fā)十分常見,比如淘寶網(wǎng)的首頁,就是個典型的三欄布局:即左邊商品導航和右邊導航固定寬度,中間的主要內(nèi)容隨瀏覽器寬...

    Hegel_Gu 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<