1.配置Spring3聲明式事務
在Spring3中配置聲明式事務比早期版本顯得更加簡便。只需要幾行配置文件+註解就可以實現面向切面的AOP事務
2.配置文件
在Spring的配置如下
<?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/beans
http://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.xsd
http://www.springframework.org/schema/tx
http://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" />
在配置文件中並沒有出現像以前版本的事務傳播和隔離級別,也就是類似如下配置
<!-- 配置事務的傳播特性 -->
<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實現類代碼如下
package impl;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.transaction.annotation.Transactional;
import pojo.Test;
@Transactional
publicclass PersonDAOImpl extends HibernateDaoSupport implements PersonDAO {
publicvoid save(Test test) {
this.getHibernateTemplate().saveOrUpdate(test);
Test test2 = new Test();
test2.setId(3);
test2.setName("3");
this.getHibernateTemplate().saveOrUpdate(test2);
thrownew RuntimeException("主鍵重複");
}
}
使用註解將此DAO實現類的所有方法進行了事務攔截,當遇到運行是異常時,事務回滾。不提交到數據庫。
當然可以指定單一原子方法進行隔離,方法可以指定
@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層可以進行原子操作的業務整合。