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后,数据才真正插入到数据库中。

工程的其他部分与原来的例子一模一样,执行效果也不变。

相关推荐