Spring编程式事务
Spring的编程式事物管理直接继承自PlatformTransactionManager接口。根据不同的Dao技术,Spring提供了不同的PlatformTransactionManager实现类,这里只介绍针对Hibernate的实现方式,如下:
在应用中我们可以直接使用HibernateTransactionManager的实例进行事物管理。/WEB-INF/mvc-config.xml和上个例子没有什么不同,下面是/WEB-INF/data-access.xml:<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEbeansPUBLIC"-//SPRING//DTDBEAN//EN""http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!--PropertyPlaceholderConfigurer-->
<beanid="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<propertyname="locations">
<list>
<value>WEB-INF/props/jdbc.properties</value>
</list>
</property>
</bean>
<!--org.apache.commons.dbcp.BasicDataSourcehastheconnectpool-->
<beanid="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<propertyname="driverClassName">
<value>${jdbc.driverClassName}</value>
</property>
<propertyname="url">
<value>${jdbc.url}</value>
</property>
<propertyname="username">
<value>${jdbc.username}</value>
</property>
<propertyname="password">
<value>${jdbc.password}</value>
</property>
</bean>
<!--sessionFactory-->
<beanid="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
destroy-method="close">
<propertyname="dataSource">
<refbean="dataSource"/>
</property>
<propertyname="mappingResources">
<list>
<value>com/yangsq/orm/user.hbm.xml</value>
</list>
</property>
<propertyname="hibernateProperties">
<props>
<propkey="hibernate.dialect">
${hibernate.dialect}
</prop>
</props>
</property>
</bean>
<!--HibernateTransactionManager-->
<beanid="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<propertyname="sessionFactory">
<refbean="sessionFactory"/>
</property>
</bean>
<!--userDao-->
<beanid="userDao"
class="com.yangsq.dao.impl.UserDaoImpl"
init-method="createTransactionDefinition">
<propertyname="sessionFactory">
<reflocal="sessionFactory"/>
</property>
<propertyname="transactionManager">
<reflocal="transactionManager"/>
</property>
</bean>
</beans>
定义了一个HibernateTransactionManager的实例,并把它注入到我们要进行事物管理的UserDaoImpl类。在bean的管理周期中,bean的初始化顺序是生成bean实例(构造方法),执行setter注入,执行init-method属性定义的函数(简化版,呵呵:)。我们针对以前的UserDaoImpl类进行修改,增加事物管理代码部分,如下:importjava.util.List;
importorg.springframework.dao.DataAccessException;
importorg.springframework.orm.hibernate3.HibernateTransactionManager;
importorg.springframework.orm.hibernate3.support.HibernateDaoSupport;
importorg.springframework.transaction.support.DefaultTransactionDefinition;
importorg.springframework.transaction.TransactionDefinition;
importorg.springframework.transaction.TransactionStatus;
importcom.yangsq.dao.UserDao;
importcom.yangsq.domain.User;
publicclassUserDaoImplextendsHibernateDaoSupportimplementsUserDao{
privateHibernateTransactionManagertransactionManager;
privateDefaultTransactionDefinitiondef;
publicHibernateTransactionManagergetTransactionManager(){
returntransactionManager;
}
publicvoidsetTransactionManager(HibernateTransactionManagertransactionManager){
this.transactionManager=transactionManager;
}
publicvoidcreateTransactionDefinition(){
def=newDefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
}
publicvoidsaveOrUpdate(Useruser){
TransactionStatusstatus=transactionManager.getTransaction(def);
try{
this.getHibernateTemplate().saveOrUpdate(user);
}catch(DataAccessExceptionex){
transactionManager.rollback(status);
throwex;
}
transactionManager.commit(status);
}
......
}
生成UserDaoImpl实例后,注入transactionManager方法,然后执行createTransactionDefinition,在这个函数里,定义了事物的一些参数,如传播行为,隔离级别等。下面是TransactionDefinition的继承图谱及主要参数:
在调用transactionManager的getTransaction方法后,返回一个TansactionStatus实例,TansactionStatus接口定义了事物执行时的状态。执行saveOrUpdate溢出后,将回滚(rollback),否则提交(commit)。
在实际断点执行时(断点在saveOrUpdate处),执行完saveOrUpdate,察看数据库后,数据并没有插入,只有当执行完transactionManager.commit后,数据才真正插入到数据库中。
工程的其他部分与原来的例子一模一样,执行效果也不变。