文章目錄
- 1.事務的概念
- 2.事務的四個特性
- 3.關于@Transcational注解的理解
- 4.使用場景
- 5.舉例
- 6.編程式事務管理
- 7.相關知識
1.事務的概念
事務,是指作為單個邏輯工作單元執行的一系列操作,結果只有成功和失敗兩種,要么全部成功(全部提交),要么全部失敗(全部回滾),即使成功了一部分,也視為失敗,執行全部回滾操作。
2.事務的四個特性
原子性(Atomicity):對數據進行操作的時候,要么全部執行,要么全部不執行;
一致性(Consistency):和原子性密切相關,事務執行成功,就使數據庫從一個一致性狀態改變到另一個一致性狀態;
隔離性(Isolation):一個事務的執行,不會被其他事務干擾;
持續性(Durability):事務一旦提交成功,那么數據庫里的數據就會永久性地改變;
3.關于@Transcational注解的理解
spring支持"編程式事務管理"和"聲明式事務管理"兩種方式。
而@Transcational注解,就屬于使用聲明式事務管理,聲明式事務管理是建立在AOP之上的,其本質是對方法前后進行攔截,然后在目標方法開始之前創建或者加入一個事務,在執行完目標方法之后根據執行情況提交或者回滾事務。
聲明式事務最大的優點是不需要通過編程的方式管理事務,這樣就不需要在業務邏輯代碼中摻雜事務管理的代碼,只需要在配置文件中做相關的事務規則聲明(或通過@Transcational注解的方式),便可以將事務規則應用到業務邏輯中。
這種非侵入式的開發方式,是spring所提倡的,也正是這樣,聲明式事務優于編程式事務。
聲明式事務唯一的不足是,它最細程度只能達到方法級別,而編程式事務可以作用到代碼塊級別,彌補的辦法是可以將需要進行事務管理的代碼塊獨立為方法等。
4.使用場景
@Transcatinal 可以作用于接口、接口方法、類以及類方法上,當作用于類上時,該類的所有public方法都將具有該類型的事務屬性,我們也可以在方法級別使用該標注來覆蓋類級別的定義。
spring不建議將@Transcational使用在接口或者接口方法上,因為只有在使用基于接口的代理時它才會生效。
另外,@Transcational注解應該只被應用到public方法上,因為只有來自外部的方法調用才會被AOP代理捕獲,也就是,類內部方法調用本類內部的其他方法并不會引起事務行為,故只能是public方法,在protected、private或者默認的方法上使用,同時不能使用static的修飾符,若使用則會被忽略,也不會報任何異常。
5.舉例
@Transactional(rollbackFor = Exception.class)
我們舉例使用的@Transactional(rollbackFor = Exception.class),如果標注在一個方法上,表示在該方法拋出任何異常時,進行事務的回滾動作。
spring不止對捕獲數據訪問異常才會進行回滾,而是只要捕獲到了運行時異常都會進行回滾。
在項目中,@Transactional(rollbackFor=Exception.class),如果類加了這個注解,那么這個類里面的方法拋出異常,就會回滾,數據庫里面的數據也會回滾。
在@Transactional注解中如果不配置rollbackFor屬性,那么事物只會在遇到RuntimeException的時候才會回滾,加上rollbackFor =Exception.class,可以讓事物在遇到非運行時異常時也回滾。
6.編程式事務管理
public FunctionResult delete(List<String> standardIdList) {if (standardIdList==null||standardIdList.size()==0){return new FunctionResult(ErrorCode.SpeExaStandardDeleteListIsNull);}TransactionStatus transactionStatus=transactionManager.startTransaction();int cnt = 0;for(String standardId:standardIdList) {try {cnt = speExaStandardDOMapper.deleteByPrimaryKey(standardId);}catch (Exception e){LogHelper.fatal(e.getMessage(),e);return new FunctionResult(ErrorCode.SpecialExaminationStandardDeleteFail);}finally{if (cnt <= 0) {transactionManager.rollback(transactionStatus);}else{transactionManager.commit(transactionStatus);}}}return new FunctionResult(ErrorCode.Success);}
7.相關知識
@transactional作用和事務
@Transcational的原理和使用
spring聲明式事務 同一類內方法調用事務失效
Spring中的@Transactional(rollbackFor = Exception.class)屬性詳解
@Transactional(rollbackFor=Exception.class)的使用
Spring事務管理實現方式之編程式事務與聲明式事務詳解