運用@Transactional,自己拋出異常時不會復原的原因,經驗之談

來源:互聯網
上載者:User

 

查看spring API可知 http://www.kuqin.com/spring2.0_doc/index.html

對EJB來說,預設的行為是EJB容器在遇到系統異常

(通常指運行時異常)時自動復原當前事務。EJB CMT遇到應用異常

(例如,除了java.rmi.RemoteException

外別的checked exception)時並不會自動復原。預設式Spring處理聲明式交易管理的規則遵守EJB習慣(只在遇到unchecked exceptions時自動復原),但通常定製這條規則會更有用。

所以

package x.y.service;

public class DefaultFooService implements FooService {

    public Foo getFoo(String fooName) {
        throw new UnsupportedOperationException();
    }

    public Foo getFoo(String fooName, String barName) {
        throw new UnsupportedOperationException();
    }

    public void insertFoo(Foo foo) {
        throw new UnsupportedOperationException();
    }

    public void updateFoo(Foo foo) {
        throw new UnsupportedOperationException();
    }
}

(對該例的目的來說,上例中實作類別(DefaultFooService

)的每個方法在其方法體中拋出UnsupportedOperationException

的做法是恰當的,我們可以看到,事務被建立出來,響應UnsupportedOperationException

的拋出,然後復原。)

@Transactional
有關的設定

在最簡單的形式下,@Transactional

指定一個介面、類、方法必須是事務性的,其預設事務語義為:read/write,PROPAGATION_REQUIRED

,ISOLATION_DEFAULT

,TIMEOUT_DEFAULT

,而且僅當遇到RuntimeException

時復原,而不是Exception

改變事務設定的其他可選屬性

 

Table 9.1. Transactional

註解的屬性

屬性 類型 描述
傳播性
枚舉型:Propagation
可選的傳播性設定 (預設值:PROPAGATION_REQUIRED

隔離性
枚舉型:Isolation
可選的隔離性層級(預設值:ISOLATION_DEFAULT

唯讀性
布爾型 讀寫型事務 vs. 唯讀型事務(預設值:false

,即唯讀型事務)
復原異常類(rollbackFor)
一組 Class

類的執行個體,必須是Throwable

的子類
一組異常類,遇到時 確保

進行復原。預設情況下checked exceptions不進行復原,僅unchecked exceptions(即RuntimeException

的子類)才進行交易回復。
復原異常類名(rollbackForClassname)
一組 Class

類的名字,必須是Throwable

的子類
一組異常類名,遇到時 確保

進行復原
不復原異常類(noRollbackFor)
一組 Class

類的執行個體,必須是Throwable

的子類
一組異常類,遇到時確保

復原。
不復原異常類名(noRollbackForClassname)
一組 Class

類的名字,必須是Throwable

的子類
一組異常類,遇到時確保

復原

 

我們推薦你參考 @Transactional

註解的javadoc,其中詳細列舉了上述各項屬性及其可選值。

 

————————————————————————————————————

通過以上可知,在spring 中運用@Transactional
註解,自己拋出異常UnsupportedOperationException會
復原,拋Exception異常,得作相關的配置才會復原。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.