Spring 事務管理
什麼是事務回滾?
舉個例子:好比轉帳操做,甲先成功匯給乙現金,若乙沒能取款成功,那麼甲的現金就應該自動退還
Spring提供了很好的事務管理體系html
Spring要進行事務管理,首先須要導入如下jar包:
cglib-nodep-2.1_3.jar
org.springframework.transaction-3.1.1.RELEASE.jarjava
如下是採用註解方式進行事務操做
1.在配置文件裏面,首先配置Spring事務管理器:node
引用jdbc包下的datasource下的DataSourceTransactionManager
固然,也一樣要爲它匹配數據源,即dataSource,由於咱們要告訴事務管理器它操做的對象數據是誰spring
2.因爲咱們是採用註解方式操做事務,因此須要在配置文件中啓動事務註解:ide
transaction-manager屬性填寫的就是上一步中的事務管理器3d
3.在須要進行事務管理的具體方法或具體類處進行註解:xml
在上例中,爲這個類標記了:@Transactional(rollbackForClassName="RuntimeException")指的是這個類下的全部方法均賦予事務回滾操做
這個用了註解的方式,目前不少java教程裏面講的都是用註解了,固然也可使用xml方式來配置,括號中的rollbackForClassName指的是一旦發生了指定異常,就自動進行事務回滾,例如此處指定了RuntimeException
爲buy方法標記了:@Transactional(propagation=Propagation.REQUIRES_NEW),指的是賦予這個方法管理事務的標記,若當前類沒有作標記而這個方法作了標記,則指只有這個方法能夠操做事務
括號中的propagation是指事務的傳播行爲,默認是REQUIRED,指當這個事務被別的事務調用時,則進入到那個調用的事務中去
若按本例中設置爲REQUIRES_NEW則指當這個事務被別的事務調用時,則先進行完當前事務,再進行那個調用的事務htm
以上能夠舉個通俗的例子:對象
好比甲有現金40,如今他買了兩本書,一本20元,一本50元,那麼他結帳時按照正常來講應該是隻能買得一本也就是那本20元的,而在事務管理中,結帳就是一個事務,單獨買每一本書也是一個事務,若是咱們設置爲REQUIRES,則表示按照結帳時的事務來進行,也就是在結帳第二本時發現餘額不足,則結帳事務回滾,致使第一本也買不成。blog
若咱們設置成REQUIRED_NEW,則表示在結帳第一本時,就應該先將結帳這個總體事務先掛起,而後去調用買第一本書的事務,成功以後,回到總體事務,可是這個時候買第二本書,因此又會進入到買第二本書的事務,發現餘額不足,因此買第二本不成功,買第二本回滾,可是不影響已經成功的第一本。因此咱們纔將其設置爲REQUIRES_NEW。