1. 程式人生 > >spring事物回滾

spring事物回滾

Spring 事務管理
什麼是事務回滾?
舉個例子:比如轉賬操作,甲先成功匯給乙現金,若乙沒能取款成功,那麼甲的現金就應該自動退還
Spring提供了很好的事務管理體系

Spring要進行事務管理,首先需要匯入以下jar包:
cglib-nodep-2.1_3.jar
org.springframework.transaction-3.1.1.RELEASE.jar


以下是採用註解方式進行事務操作
1.在配置檔案裡面,首先配置Spring事務管理器:

wKioL1bIfp7hHT2YAAAqkz-eK5I593.png
引用jdbc包下的datasource下的DataSourceTransactionManager
當然,也同樣要為它匹配資料來源,即dataSource,因為我們要告訴事務管理器它操作的物件資料是誰

2.由於我們是採用註解方式操作事務,所以需要在配置檔案中啟動事務註解:

wKioL1bIfsHScwXkAABAsfNTRXw418.png
transaction-manager屬性填寫的就是上一步中的事務管理器

3.在需要進行事務管理的具體方法或具體類處進行註解:

wKiom1bIfw7gIYeVAAB45qntHCE995.png
在上例中,為這個類標記了:@Transactional(rollbackForClassName="RuntimeException")指的是這個類下的所有方法均賦予事務回滾操作
這個用了註解的方式,目前很多java教程裡面講的都是用註解了,當然也可以使用xml方式來配置,括號中的rollbackForClassName指的是一旦發生了指定異常,就自動進行事務回滾,例如此處指定了RuntimeException


為buy方法標記了:@Transactional(propagation=Propagation.REQUIRES_NEW)指的是賦予這個方法管理事務的標記,若當前類沒有做標記而這個方法做了標記,則指只有這個方法可以操作事務
括號中的propagation是指事務的傳播行為,預設是REQUIRED,指當這個事務被別的事務呼叫時,則進入到那個呼叫的事務中去
若按本例中設定為REQUIRES_NEW則指當這個事務被別的事務呼叫時,則先進行完當前事務,再進行那個呼叫的事務


以上可以舉個通俗的例子:

比如甲有現金40,現在他買了兩本書,一本20元,一本50元,那麼他結賬時按照正常來說應該是隻能買得一本也就是那本20元的,而在事務管理中,結賬就是一個事務,單獨買每一本書也是一個事務,如果我們設定為REQUIRES,則表示按照結賬時的事務來進行,也就是在結賬第二本時發現餘額不足,則結賬事務回滾,導致第一本也買不成。

若我們設定成REQUIRED_NEW,則表示在結賬第一本時,就應該先將結賬這個整體事務先掛起,然後去呼叫買第一本書的事務,成功之後,回到整體事務,但是這個時候買第二本書,所以又會進入到買第二本書的事務,發現餘額不足,所以買第二本不成功,買第二本回滾,但是不影響已經成功的第一本。所以我們才將其設定為REQUIRES_NEW。