frontpage可以做網站嗎百度seo軟件首選帝搜軟件
事務管理
事務管理在系統(tǒng)開發(fā)中是不可缺少的一部分,Spring提供了很好的事務管理機制,主要分為編程式事務和聲明式事務兩種。
編程式事務: 是指在代碼中手動的管理事務的提交、回滾等操作,代碼侵入比較強。
聲明式事務: 基于AOP面向切面的,它將具體業(yè)務與事務處理部分解耦,代碼侵入性很低,所以在實際開發(fā)中聲明式事務比較多。聲明式事務有兩種實現(xiàn)方式,分別式基于TX和AOP的xml配置文件方式,第二種就是基于 @Transactional注解。
可以用在哪些地方?
@Transactional可以用在接口、類、類方法
-
作用于類:當把@Transactional注解放在類上時,表示所有該類的 public 方法都配置相同的事務屬性信息。
-
作用于方法:當類配置了@Transactional,方法也配置了@Transactional,方法的事務會覆蓋類的事務配置信息。
-
作用于接口:不推薦這種使用方法,因為一旦標注在 Interface 上并配置了 Spring AOP 使用 CGLib 動態(tài)代理,將會導致 @Transactional 注解失效。
@Transactional 注解參數(shù)說明
參數(shù) | 功能 |
---|---|
readOnly | 該屬性用于設置當前事務是否為只讀事務,設置為true表示只讀,false表示可讀寫,默認為false。例如:@Transactional(readOnly=true) |
rollbackFor | 該屬性用于設置需要進行回滾的異常類數(shù)組,當方法中拋出指定異常時,則進行事務回滾。例如:指定單一異常類:@Transactional(rollbackFor=RuntimeException.class),也可以指定多個異常類,默認是:RuntimeException和Error |
rollbackForClassName | 該屬性用于設置需要進行回滾的異常類名稱數(shù)組,當方法拋出指定異常名稱的異常時,則進行事務回滾。例如:指定單一異常類名稱@Transactional(rollbackForClassName=“RuntimeException”)指定多個:@Transactional(rollbackForClassName={“RuntimeException”,“Exception”}) |
noRollbackFor | 該屬性用于設置不需要進行回滾的異常類數(shù)組,當方法中拋出指定異常數(shù)組中的異常時,不進行事務回滾。例如:指定單一異常類 @Transactional(noRollbackFor=RuntimeException.class) 指定多個:@Transactional(noRollbackFor={RuntimeException.class, Exception.class}) |
noRollbackForClassName | 該屬性用于設置不需要進行回滾的異常類名稱數(shù)組。 |
propagation | 該屬性用于設置事務的傳播行為,例如:@Transactional(propagation=Propagation.NOT_SUPPORTED) |
timeout | 該屬性用于設置事務的超時秒數(shù),默認值為-1表示永不超時 |
isolation | 該屬性用于設置底層數(shù)據(jù)庫的事務隔離級別,事務隔離界別用于處理多事務并發(fā)情況,通常使用數(shù)據(jù)庫默認的隔離級別即可。 |
注意事項以及失效情況
-
@Transactional 應用在非 public 修飾的方法上
-
@Transactional 注解屬性 propagation 設置錯誤,配置以下三種 propagation,事務將不會發(fā)生回滾。
-
PROPAGATION_SUPPORTS:如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續(xù)運行。
-
PROPAGATION_NOT_SUPPORTED:以非事務方式運行,如果當前存在事務,則把當前事務掛起。
-
PROPAGATION_NEVER:以非事務方式運行,如果當前存在事務,則拋出異常。
-
-
@Transactional 注解屬性 rollbackFor 設置錯誤
-
同一個類中方法調用,導致@Transactional失效
-
異常被catch吞掉導致失效
-
數(shù)據(jù)庫引擎不支持事務
?