Spring3配置聲明式事務

1.配置Spring3聲明式事務

Spring3中配置聲明式事務比早期版本顯得更加簡便。只需要幾行配置文件+註解就可以實現面向切面的AOP事務

2.配置文件

在Spring的配置如下

Java代碼 收藏代碼
  1. <?xml version="1.0" encoding="UTF-8"?>  

  2. <beans xmlns="http://www.springframework.org/schema/beans"

  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"

  4.     xmlns:tx="http://www.springframework.org/schema/tx"

  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans

  6.     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 

  7.     http://www.springframework.org/schema/context 

  8.     http://www.springframework.org/schema/context/spring-context-3.0.xsd

  9.     http://www.springframework.org/schema/tx

  10.     http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"

  11. default-autowire="byName">  

  12.  

  13.     <!-- 配置Spring上下文的註解 -->  

  14.     <context:annotation-config />  

  15.  

  16.     <!-- 配置DAO類 -->  

  17.     <bean id="persondao"class="impl.PersonDAOImpl">  

  18.         <property name="sessionFactory" ref="sessionFactory" />  

  19.     </bean>  

  20.  

  21.     <!-- 事務管理配置 -->  

  22.     <!-- 配置事務管理開始 -->  

  23.     <bean id="txManager"

  24. class="org.springframework.orm.hibernate3.HibernateTransactionManager">  

  25.         <property name="sessionFactory" ref="sessionFactory" />  

  26.     </bean>  

  27.  

  28.     <tx:annotation-driven transaction-manager="txManager" />  

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.0.xsd"default-autowire="byName"><!-- 配置Spring上下文的註解 --><context:annotation-config /><!-- 配置DAO類 --><bean id="persondao" class="impl.PersonDAOImpl"><property name="sessionFactory" ref="sessionFactory" /></bean><!-- 事務管理配置 --><!-- 配置事務管理開始 --><bean id="txManager"class="org.springframework.orm.hibernate3.HibernateTransactionManager"><property name="sessionFactory" ref="sessionFactory" /></bean><tx:annotation-driven transaction-manager="txManager" />

在配置文件中並沒有出現像以前版本的事務傳播和隔離級別,也就是類似如下配置 

 

Java代碼 收藏代碼
  1. <!-- 配置事務的傳播特性 -->   

  2. <tx:advice id="txAdvice" transaction-manager="transactionManager">   

  3. <tx:attributes>   

  4. <tx:method name="add*" propagation="REQUIRED"/>   

  5. <tx:method name="del*" propagation="REQUIRED"/>   

  6. <tx:method name="modify*" propagation="REQUIRED"/>   

  7. <tx:method name="*" read-only="true"/>   

  8. </tx:attributes>   

  9. </tx:advice>  

<!-- 配置事務的傳播特性 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="add*" propagation="REQUIRED"/> <tx:method name="del*" propagation="REQUIRED"/> <tx:method name="modify*" propagation="REQUIRED"/> <tx:method name="*" read-only="true"/> </tx:attributes> </tx:advice>

因爲可以通過註解@Transactional完成事務傳播、事務隔離的功能。

3.DAO代碼

DAO實現類代碼如下

Java代碼 收藏代碼
  1. package impl;  

  2.  

  3. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;  

  4. import org.springframework.transaction.annotation.Transactional;  

  5.  

  6. import pojo.Test;  

  7.  

  8. @Transactional

  9. publicclass PersonDAOImpl extends HibernateDaoSupport implements PersonDAO {  

  10.  

  11. publicvoid save(Test test) {  

  12. this.getHibernateTemplate().saveOrUpdate(test);  

  13.         Test test2 = new Test();  

  14.         test2.setId(3);  

  15.         test2.setName("3");  

  16. this.getHibernateTemplate().saveOrUpdate(test2);  

  17.  

  18. thrownew RuntimeException("主鍵重複");  

  19.     }  

  20.  

  21. }  

package impl;import org.springframework.orm.hibernate3.support.HibernateDaoSupport;import org.springframework.transaction.annotation.Transactional;import pojo.Test;@Transactionalpublic class PersonDAOImpl extends HibernateDaoSupport implements PersonDAO {public void save(Test test) {this.getHibernateTemplate().saveOrUpdate(test);Test test2 = new Test();test2.setId(3);test2.setName("3");this.getHibernateTemplate().saveOrUpdate(test2);throw new RuntimeException("主鍵重複");}}

使用註解將此DAO實現類的所有方法進行了事務攔截,當遇到運行是異常時,事務回滾。不提交到數據庫。

當然可以指定單一原子方法進行隔離,方法可以指定

 

Java代碼 收藏代碼
  1. @Transactional(propagation=Propagation.NOT_SUPPORTED)  

  2. @Transactional(propagation=Propagation.MANDATORY)  

  3. @Transactional(propagation=Propagation.NESTED)  

  4. @Transactional(propagation=Propagation.REQUIRED)  

  5. @Transactional(propagation=Propagation.REQUIRES_NEW)  

  6. @Transactional(propagation=Propagation.SUPPORTS)  

@Transactional(propagation=Propagation.NOT_SUPPORTED)@Transactional(propagation=Propagation.MANDATORY)@Transactional(propagation=Propagation.NESTED)@Transactional(propagation=Propagation.REQUIRED)@Transactional(propagation=Propagation.REQUIRES_NEW)@Transactional(propagation=Propagation.SUPPORTS)

之後在Service層可以進行原子操作的業務整合。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章