sukyle的专栏

着急的事,慢慢地说;大事要事,想清楚说;小事琐事,幽默地说;做不到的事,不要随便说;伤人的事,坚决不说;没有的事,不要胡说;别人的事,谨慎地说;自己的事,坦诚直说;该做的事,做好再说;将来的事,到时再...

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

阅读更多
个人分类: Spring等
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭