事務的嵌套概念
所謂事務的嵌套就是兩個事務方法之間相互調(diào)用。spring事務開啟 ,或者是基于接口的或者是基于類的代理被創(chuàng)建(注意一定要是代理,不能手動new 一個對象,并且此類(有無接口都行)一定要被代理——spring中的bean只要納入了IOC管理都是被代理的)。所以在同一個類中一個方法調(diào)用另一個方法有事務的方法,事務是不會起作用的。
spring 事務異常處理
Spring默認情況下會對運行期例外(RunTimeException),即uncheck異常,進行事務回滾。如果遇到checked異常就不回滾。改變默認規(guī)則的方法如下 :
- 讓checked例外也回滾:在整個方法前加上 @Transactional(rollbackFor=Exception.class)
- 讓unchecked例外不回滾: @Transactional(notRollbackFor=RunTimeException.class)
- 不需要事務管理的(只查詢的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)
spring事務傳播屬性
在 spring的 TransactionDefinition接口中一共定義了六種事務傳播屬性:
PROPAGATION_REQUIRED -- 支持當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。
PROPAGATION_SUPPORTS -- 支持當前事務,如果當前沒有事務,就以非事務方式執(zhí)行。
PROPAGATION_MANDATORY -- 支持當前事務,如果當前沒有事務,就拋出異常。
PROPAGATION_REQUIRES_NEW -- 新建事務,如果當前存在事務,把當前事務掛起。
PROPAGATION_NOT_SUPPORTED -- 以非事務方式執(zhí)行操作,如果當前存在事務,就把當前事務掛起。
PROPAGATION_NEVER -- 以非事務方式執(zhí)行,如果當前存在事務,則拋出異常。
PROPAGATION_NESTED -- 如果當前存在事務,則在嵌套事務內(nèi)執(zhí)行。如果當前沒有事務,則進行與PROPAGATION_REQUIRED類似的操作。
前六個策略類似于EJB CMT,第七個(PROPAGATION_NESTED)是Spring所提供的一個特殊變量。
它要求事務管理器或者使用JDBC 3.0 Savepoint API提供嵌套事務行為(如Spring的DataSourceTransactionManager)