Spring编程式事务

Spring的编程式事物管理直接继承自PlatformTransactionManager接口。根据不同的Dao技术,Spring提供了不同的PlatformTransactionManager实现类,这里只介绍针对Hibernate的实现方式,如下:
Spring学习笔记(十八)----Spring编程式事务
在应用中我们可以直接使用HibernateTransactionManager的实例进行事物管理 。/WEB-INF/mvc-config.xml和上个例子没有什么不同,下面是 /WEB-INF/data-access.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
 <!--PropertyPlaceholderConfigurer-->
 <bean id="propertyConfigurer"
  class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="locations">
   <list>
    <value>WEB-INF/props/jdbc.properties</value>
   </list>
  </property>
 </bean>
 
 <!--org.apache.commons.dbcp.BasicDataSource has the connect pool-->
 <bean id="dataSource"
  class="org.apache.commons.dbcp.BasicDataSource"
  destroy-method="close">
  <property name="driverClassName">
   <value>${jdbc.driverClassName}</value>
  </property>
  <property name="url">
   <value>${jdbc.url}</value>
  </property>
  <property name="username">
   <value>${jdbc.username}</value>
  </property>
  <property name="password">
   <value>${jdbc.password}</value>
  </property>
 </bean>

 <!--sessionFactory-->
 <bean id="sessionFactory"
  class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
  destroy-method="close">
  <property name="dataSource">
   <ref bean="dataSource" />
  </property>
  <property name="mappingResources">
   <list>
    <value>com/yangsq/orm/user.hbm.xml</value>
   </list>
  </property>
  <property name="hibernateProperties">
   <props>
    <prop key="hibernate.dialect">
     ${hibernate.dialect}
    </prop>
   </props>
  </property>
 </bean>

 <!--HibernateTransactionManager-->
 <bean id="transactionManager"
  class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory">
   <ref bean="sessionFactory"/>
  </property>
 </bean>

 
 <!--userDao-->
 <bean id="userDao"
  class="com.yangsq.dao.impl.UserDaoImpl"
  init-method="createTransactionDefinition">
  <property name="sessionFactory">
   <ref local="sessionFactory" />
  </property>
  <property name="transactionManager">
   <ref local="transactionManager"/>
  </property>
 </bean>
 
</beans>

定义了一个HibernateTransactionManager的实例,并把它注入到我们要进行事物管理的UserDaoImpl类。在bean的管理周期中,bean的初始化顺序是生成bean实例(构造方法),执行setter注入,执行init-method属性定义的函数(简化版,呵呵:)。我们针对以前的UserDaoImpl类进行修改,增加事物管理代码部分,如下:

import java.util.List;

import org.springframework.dao.DataAccessException;
import org.springframework.orm.hibernate3.HibernateTransactionManager;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;

import com.yangsq.dao.UserDao;
import com.yangsq.domain.User;

public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
 private HibernateTransactionManager transactionManager;
 private DefaultTransactionDefinition def;
 
 public HibernateTransactionManager getTransactionManager() {
  return transactionManager;
 }
 
 public void setTransactionManager(HibernateTransactionManager transactionManager) {
  this.transactionManager = transactionManager;
 }
 
 public void createTransactionDefinition(){
  def = new DefaultTransactionDefinition();
  def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
  def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
 }

 
 public void saveOrUpdate(User user){
  TransactionStatus status = transactionManager.getTransaction(def);
  try{
   this.getHibernateTemplate().saveOrUpdate(user);
  }catch(DataAccessException ex){
   transactionManager.rollback(status);
   throw ex;
  }
  transactionManager.commit(status);
 }
 ......
}

    生成UserDaoImpl实例后,注入transactionManager方法,然后执行createTransactionDefinition,在这个函数里,定义了事物的一些参数,如传播行为,隔离级别等。下面是TransactionDefinition的继承图谱及主要参数:

Spring学习笔记(十八)----Spring编程式事务

    在调用transactionManager的getTransaction方法后,返回一个TansactionStatus实例,TansactionStatus接口定义了事物执行时的状态。执行saveOrUpdate溢出后,将回滚(rollback),否则提交(commit)。

   在实际断点执行时(断点在saveOrUpdate处),执行完saveOrUpdate,察看数据库后,数据并没有插入,只有当执行完transactionManager.commit后,数据才真正插入到数据库中。

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

 

 

 

http://blog.sina.com.cn/s/blog_4b86f2ee01000784.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值