最近在ssm框架的項目中需要用到獨立事務的實現,找了半天,搜集了以下理論知識為實現做准備。事務管理器為datasource
(1)Spring在transactiondefinition接口中規定了7種類型的事務傳播行為,propagation開頭,
1:required 如果沒有事務,就新建一個事務,如果已經存在一個事務就加入到該事務中。這是最常見的選擇。
2:supports 支持當前事務,如果沒有則以非事務的方式執行
3: mandatory 使用當前事務,如果沒有則拋出異常
4:requires_new 新建事務並掛起當前事務,需要使用jtaTransactionManager作為事務管理器(獨立事務用這個)好像datasourceTransactionManager也可以用
5:not_supported 以非事務方式運行,掛起當前事務,需要使用jtaTransactionManager作為事務管理器
6:never 以非事務方式運行,如果存在事務則拋出異常
7:nested 如果一個活動的事務存在,則運行在一個嵌套的事務中.,如果沒有當前事務類似於1required ,DataSourceTransactionManager使用savepoint支持 PROPAGATION_NESTED時,需要JDBC 3.0以上驅動及1.4以上的JDK版本支持,外層事務的回滾可以引起內層事務的回滾。而內層事務的異常並不會導致外層事務的回滾
(2)在transactionManager事務管理器中定義了5個不同的事務隔離級別 isolution開頭
1:default 默認使用數據庫的隔離級別
2:read_uncommitted 允許其他事務可以看到當前事務未提交的數據,出現臟讀、不可重復度和幻象讀
3:read_committed 保證當前事務修改的數據提交后才可被其他事務毒素,不會出現臟讀,會出現可重復度和幻象讀 一般用這個即可
4:repeatable_read 可能出現幻像讀
5:serializable 事務被處理為順序執行,耗費了最大的資源
(3)內置事務管理器實現
Spring提供了許多內置事務管理器實現:
- DataSourceTransactionManager:位於org.springframework.jdbc.datasource包中,數據源事務管理器,提供對單個javax.sql.DataSource事務管理,用於Spring JDBC抽象框架、iBATIS或MyBatis框架的事務管理;
- JdoTransactionManager:位於org.springframework.orm.jdo包中,提供對單個javax.jdo.PersistenceManagerFactory事務管理,用於集成JDO框架時的事務管理;
- JpaTransactionManager:位於org.springframework.orm.jpa包中,提供對單個javax.persistence.EntityManagerFactory事務支持,用於集成JPA實現框架時的事務管理;
- HibernateTransactionManager:位於org.springframework.orm.hibernate3包中,提供對單個org.hibernate.SessionFactory事務支持,用於集成Hibernate框架時的事務管理;該事務管理器只支持Hibernate3+版本,且Spring3.0+版本只支持Hibernate 3.2+版本;
- JtaTransactionManager:位於org.springframework.transaction.jta包中,提供對分布式事務管理的支持,並將事務管理委托給Java EE應用服務器事務管理器;
- OC4JjtaTransactionManager:位於org.springframework.transaction.jta包中,Spring提供的對OC4J10.1.3+應用服務器事務管理器的適配器,此適配器用於對應用服務器提供的高級事務的支持;
- WebSphereUowTransactionManager:位於org.springframework.transaction.jta包中,Spring提供的對WebSphere 6.0+應用服務器事務管理器的適配器,此適配器用於對應用服務器提供的高級事務的支持;
- WebLogicJtaTransactionManager:位於org.springframework.transaction.jta包中,Spring提供的對WebLogic 8.1+應用服務器事務管理器的適配器,此適配器用於對應用服務器提供的高級事務的支持。
代碼
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
//def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status = transactionManagerTmp.getTransaction(def);
//需要調用的方法,獨立事務
ResultInfo returnResult = decpMsgServiceClient.createAndsendMessage(globalBusinessID, businessType, messageID, content);
transactionManagerTmp.commit(status);
手動提交獨立事務
