列宿乃施于上荣兮 日月才经于柍桭

………… 白驹过隙 岁月如斯 梦萦回绕 心灵之声
posts - 57, comments - 8, trackbacks - 0, articles - 41
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Spring中的事务应用

Posted on 2010-07-04 15:16 默认为零 阅读(139) 评论(0)  编辑  收藏 所属分类: 技术

  Spring中的事务管理有声明式事务和编码式事务两种。
  声明式事务顾名思义就是采用声明的方式来处理事务。是指在Spring配置文件中声明式的处理事务来代替代码式的处理事务。Spring使用AOP来完成声明式的事务管理,因而声明式事务是以方法为单位,而事务管理不侵入开发的组件的一种事务处理方式。
  而编码式事务显然就是通过应用开发者的事务相关编码行为完成事务实现的一种处理方式。
 
声明式事务

  首先定义事务代理如下:

<bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
 
<property name="transactionManager" ref="transactionManager" />
 
<property name="transactionAttributes">
  
<props>
   
<prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>
   
<prop key="remove*">PROPAGATION_REQUIRED,-Exception</prop>
   
<prop key="update*">PROPAGATION_REQUIRED,-Exception</prop>
   
<prop key="query*">PROPAGATION_REQUIRED,readOnly</prop>
  
</props>
 
</property>
</bean>

  key属性确定代理应该给哪个方法增加事务行为。这样的属性最重要的部份是传播行为。有以下选项可供使用:

  PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 
  PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。 
  PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。 
  PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。 
  PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 
  PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。


  其次对于事务代理的引用:

<bean id="userManager" parent="baseTransactionProxy">
  
<property name="target">
   
<bean class="com.alibaba.xxx.service.impl.UserManagerImpl">
    
<property name="userDao" ref="userDao" />
    
<property name="roleDao" ref="roleDao" />
   
</bean>
  
</property>
 
</bean>

  这样如果UserManagerImpl实现中如果含有save*、remove*、update*、query*的方法名,Spring会自动应用其相应配置的事务实现。

编码式事务

1、TransactionTemplate的事务处理

TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
 
//调用transactionTemplate的execute方法进行事务管理
Object result = transactionTemplate.execute (
//回调函数实现了TransactionCallback接口的doInTransaction方法
 new TransactionCallback() {
 
public Object doInTransaction(TransactionStatus status) {
  
//数据库操作代码
  
//userDao.xxx();
  
//roleDao.xxx();
  return resultObject;
 }

}
);


2、JdbcTemplate的事务处理

DefaultTransactionDefinition def = new DefaultTransactionDefinition(); 
TransactionStatus status 
= transactionManager.getTransaction(def); 
try{
 JdbcTemplate jdbcTemplate 
= new JdbcTemplate(dataSource); 
 jdbcTemplate.update(
"insert into tbl_user_info values(xx, xx, xx)"); 
}
 catch (DataAccessException ex) {
 transactionzManager.rollback(status); 
 
throw ex;
}
 finally{
 transactionManager.commit(status); 
}
  编码式事务还有其他编写方式,Spring中单数据源的事务其实就是对JDBC的简单封装,其操作方式非常类似JDBC的事务应用。

只有注册用户登录后才能发表评论。


网站导航: