首頁>技術>

熟悉Spring的人都知道,Spring中提供了很好的事務管理機制--程式設計式事務和宣告式事務。程式設計式事務管理是侵入性事務管理,使用TransactionTemplate或者PlatformTransactionManager手動管理事務的提交、回滾等操作。宣告式事務建立在AOP之上,原理是對方法進行攔截,在目標方法執行之前新增事務,目標方法執行後根據執行情況進行事務的提交或回滾。程式設計式事務是侵入式的,宣告式事務是非侵入性的,因此,提倡使用宣告式事務。@Transactional註解是實現宣告式事務的方式之一。

一、@Transactional概述

@Transactional註解可以加在方法、類和介面上,加在類和介面上等於給類中的每個public方法都添加了@Transactional,在使用時儘量直接加在方法上。@Transactional屬性及說明見下表:

屬性說明name配置檔案中有多個TransactionManager時,透過name屬性指定使用哪個事務管理器propagation事務的傳播行為,預設為Propagation.REQUIREDisolation事務的隔離級別,預設為Isolation.DEFAULT,使用資料庫的預設隔離級別timeout事務的超時時間,預設為-1,如果事務在該時間內沒有完成則自動回滾readOnly是否是隻讀事務rollbackFor觸發事務回滾的異常型別,存在多個時用逗號分隔noRollbackFor不觸發事務回滾的異常型別

二、@Transactional不生效的場景

1、用在非public方法

@Transactional是基於動態代理的,Spring的代理工廠在啟動時會掃描所有的類和方法,並檢查方法的修飾符是否為public,非public時不會獲取@Transactional的屬性資訊,這時@Transactional的動態代理物件為空。

2、同一個類中,非@Transactional方法呼叫@Transactional方法

還是動態代理的原因,類內部方法的呼叫是透過this呼叫的,不會使用動態代理物件,事務不會回滾。

3、異常被“吃了”

Spring是根據丟擲的異常來回滾的,如果異常被捕獲了沒有丟擲的話,事務就不會回滾。

4、rollbackFor屬性設定不對

Spring預設丟擲unchecked異常或Error時才會回滾事務,要想其他型別異常也回滾則需要設定rollbackFor屬性的值。

5、資料庫引擎不支援事務

32
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • PO、VO、BO,JavaWeb中的這幾個“O”,你都瞭解嗎