Spring事務的傳播行爲在service類前加上@Transactional,聲明這個service全部方法須要事務管理。每個業務方法開始時都會打開一個事務。 Spring默認狀況下會對運行期例外(RunTimeException)進行事務回滾。這個例外是unchecked
若是遇到checked意外就不回滾。 java
如何改變默認規則:
1 讓checked例外也回滾:在整個方法前加上 @Transactional(rollbackFor=Exception.class)
2 讓unchecked例外不回滾: @Transactional(notRollbackFor=RunTimeException.class)
3 不須要事務管理的(只查詢的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)
在整個方法運行前就不會開啓事務
能夠加上:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true),這樣就作成一個只讀事務,能夠提升效率。 各類屬性的意義: REQUIRED:業務方法須要在一個容器裏運行。若是方法運行時,已經處在一個事務中,那麼加入到這個事務,不然本身新建一個新的事務。 NOT_SUPPORTED:聲明方法不須要事務。若是方法沒有關聯到一個事務,容器不會爲他開啓事務,若是方法在一個事務中被調用,該事務會被掛起,調用結束後,原先的事務會恢復執行。REQUIRESNEW:無論是否存在事務,該方法總彙爲本身發起一個新的事務。若是方法已經運行在一個事務中,則原有事務掛起,新的事務被建立。MANDATORY:該方法只能在一個已經存在的事務中執行,業務方法不能發起本身的事務。若是在沒有事務的環境下被調用,容器拋出例外。SUPPORTS:該方法在某個事務範圍內被調用,則方法成爲該事務的一部分。若是方法在該事務範圍外被調用,該方法就在沒有事務的環境下執行。NEVER:該方法絕對不能在事務範圍內執行。若是在就拋例外。只有該方法沒有關聯到任何事務,才正常執行。NESTED:若是一個活動的事務存在,則運行在一個嵌套的事務中。若是沒有活動事務,則按REQUIRED屬性執行。它使用了一個單獨的事務,這個事務擁有多個能夠回滾的保存點。內部事務的回滾不會對外部事務形成影響。它只對DataSourceTransactionManager事務管理器起效。數據庫
ssh 事務處理
ssh
首先是一個BaseDaoImpl,這個Dao集成了HibernateDaoSupport,實現了對於數據表的增刪改查操做。
例如:修改方法:
spa
public void modifyModel(Object model) throws UpdateException{ try { super.getHibernateTemplate().update(model); } catch (Exception ex) { logger.error("PersistentBaseDAOImpl:" + model.getClass().getName()); throw new UpdateException(ex); } }
都是相似這樣的單個業務的邏輯。而後各個業務Dao經過Spring的bean配置,去使用這個BaseDao中的方法來完成自身不一樣的數據庫操做。
若是有這樣一個功能,執行UserAction,這個Action中的某個方法會調用UserDao中的getUserContent方法。
在getUserContent方法中,首先調用BaseDao的查詢方法,獲取了該用戶存在,併合法。以後再去調用另外一個Dao中的方法,如ContentDao中的getContent方法去獲取該用戶所發的文章。
總的來講就是在UserDao中的getUserContent方法內,進行了兩次對數據庫的操做。
那麼將這個方法配置到Spring的事務管理中,這兩個對數據庫的操做就成爲了一個事務,根據事務的原子性被統一的管理。
基本就是如下這個圖:
UserAction--->UserDao.getUserContent()--即完成驗證用戶功能,又獲取用戶文章
如今遇到的是三層結構的邏輯。
UserAction--->UserService.getUserContent()
|---UserDao.fineUser()---驗證用戶
|---ContentDao.getContentByUserId()---獲取用戶文章
若是將UserDao和ContentDao配置在Spring的事務管理中,那麼執行UserService中的方法,其實是執行了兩個不一樣的事務來完成這個邏輯。可是把UserService配置到事務中,感受又不合邏輯,也沒配過。
如今我看來,若是把整個邏輯定義爲一個事務,必需要把Service層的方法配置在Spring的事務管理中了。code