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