sping事務只對RuntimeException和Error類型的異常生效 不對checked exceptions生效 就是try catch捕獲的異常
事務回滾的流程 捕獲異常 判斷異常類型 如果是RuntimeException和Error就進行roll back操作
- status.hasSavepoint()如果status中有savePoint,只回滾到savePoint!
- status.isNewTransaction()如果status是一個新事務,纔會真正去回滾!
- status.hasTransaction()如果status有事務,將會對staus中的事務標記!
2 核心接口
2.1 平臺事務管理器(PlatformTransactionManager)
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean>
2.2 基礎事務屬性定義(TransactionDefinition)
2.2.1 傳播行爲
傳播行爲
|
含義
|
PROPAGATION_REQUIRED
|
表示當前方法必須運行在事務中。如果當前事務存在,方法將會在該事務中運行。否則,會啓動一個新的事務
|
PROPAGATION_SUPPORTS
|
表示當前方法不需要事務上下文,但是如果存在當前事務的話,那麼該方法會在這個事務中運行
|
PROPAGATION_MANDATORY
|
表示該方法必須在事務中運行,如果當前事務不存在,則會拋出一個異常
|
PROPAGATION_REQUIRED_NEW
|
表示當前方法必須運行在它自己的事務中。一個新的事務將被啓動。如果存在當前事務,在該方法執行期間,當前事務會被掛起。如果使用JTATransactionManager的話,則需要訪問TransactionManager
|
PROPAGATION_NOT_SUPPORTED
|
表示該方法不應該運行在事務中。如果存在當前事務,在該方法運行期間,當前事務將被掛起。如果使用JTATransactionManager的話,則需要訪問TransactionManager
|
PROPAGATION_NEVER
|
表示當前方法不應該運行在事務上下文中。如果當前正有一個事務在運行,則會拋出異常
|
PROPAGATION_NESTED
|
表示如果當前已經存在一個事務,那麼該方法將會在嵌套事務中運行。嵌套的事務可以獨立於當前事務進行單獨地提交或回滾。如果當前事務不存在,那麼其行爲與PROPAGATION_REQUIRED一樣。注意各廠商對這種傳播行爲的支持是有所差異的。可以參考資源管理器的文檔來確認它們是否支持嵌套事務
|
2.2.2 隔離級別
隔離級別
|
含義
|
ISOLATION_DEFAULT
|
使用後端數據庫默認的隔離級別
|
ISOLATION_READ_UNCOMMITTED
|
最低的隔離級別,允許讀取尚未提交的數據變更,可能會導致髒讀、幻讀或不可重複讀
|
ISOLATION_READ_COMMITTED
|
允許讀取併發事務已經提交的數據,可以阻止髒讀,但是幻讀或不可重複讀仍有可能發生
|
ISOLATION_REPEATABLE_READ
|
對同一字段的多次讀取結果都是一致的,除非數據是被本身事務自己所修改,可以阻止髒讀和不可重複讀,但幻讀仍有可能發生
|
ISOLATION_SERIALIZABLE
|
最高的隔離級別,完全服從ACID的隔離級別,確保阻止髒讀、不可重複讀以及幻讀,也是最慢的事務隔離級別,因爲它通常是通過完全鎖定事務相關的數據庫表來實現的
|
2.2.3 只讀
2.2.4 事務超時
2.2.5 回滾規則
2.3 事務狀態
3 事務的實現方式
3.1 編程式和聲明式事務的區別