随笔 - 37  文章 - 14  trackbacks - 0
<2007年8月>
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678

常用链接

留言簿

随笔分类

随笔档案

文章分类

相关链接

搜索

  •  

最新评论

阅读排行榜

评论排行榜

      Spring没有直接管理事务,它有很多供选择的事务管理的责任委托给使用JTA或持久化机制的某个特定平台实现;但Spring通过PlatformTransactionManager这个接口来实现事务管理。
      大多情况不直接使用PlatformTransactionManager;对于编程式事务可以采用TransactionTemplate,对于声明式事务结合AOP采用TransactionProxyFactoryBean。这两种策略都会与PlatformTransactionManager交互,并从TransactionDefinition中获得。
TransactionDefinition接口声明了事务设置,如传播行为、隔离级别、超时设置。DefaultTransactionDefinition类是带有预设值(PROPAGATION_REQUIRED,ISOLATION_DEFAULT, TIMEOUT_DEFAULT, readOnly=false)的实现。它是TransactionTemplate和DefaultTransactionAttribute基类。
一、编程式事务:
A:假设是Hibernate事务,利用TransactionTemplate类来实现事务控制。
Hibernate事务管理器配置如下
     <bean id="transactionManager"
     class
="org.springframework.orm.hibernate3.HibernateTransactionManager">
     
<property name="sessionFactory">
     
<ref bean="spcSessionFactory"/>
     
</property>
     
</bean>
TransactionTemplate类配置如下
      <bean id="transactionTemplate"
     class
="org.springframework.transaction.support.TransactionTemplate">
     
<property name="transactionManager">
         
<ref bean="transactionManager" />
     
</property>
     
</bean>
在所需要事务管理的类里,并通过IOC载入transactionTemplate;下面展示TransactionTemplate如何利用回调机制在程序里添加事务边界。
public void saveData(){
    transactionTemplate.execute(
    
new TransactionCallback(){
        
public Object doInTransaction(TransactionStatus ts){
            
try{
                
//do stuff
            }
catch (Exception e){
                ts.setRollbackOnly();
                }

            }

        }

    );
    }
这样就达到用Spring的编程方式来管理事务。从中我们可以看出transactionTemplate对象有一个transactionManager属性。在幕后,TransationTemplate使用PlatformTransactionManager的一个实现来处理特定平台的事务管理细节。
B:另一种编程事务的方法是直接使用PlatformTransactionManager。这种方法的问题是你必须管理逻辑,在抛出异常时回滚事务。要使用PlatformTransactionManager,执行下面的步骤。
public void saveUser(final User user) {
DefaultTransactionDefinition txDef 
=
new DefaultTransactionDefinition();
// set propagation behavior, isolation level etc. template
// we don't need to since REQUIRED (the default) is good enough
TransactionStatus status =
transactionManager.getTransaction(txDef);
try {
// do business logic
String lastName = user.getLastName();
for (int i = 0; i < 3; i++{
// can't just set user.id to null or Hibernate
// complains that identifier was changed
User u = new User();
u.setFirstName(user.getFirstName());
u.setLastName(user.getLastName() 
+ i);
// make the last one a duplicate record
if (i == 2{
u.setLastName(lastName 
+ 0);
}

if (log.isDebugEnabled()) {
log.debug(
"entering record " + u);
}

dao.saveUser(u);
}

}
 catch (DataAccessException ex) {
transactionManager.rollback(status);
throw ex;
}

transactionManager.commit(status);
}
相比较使用TransactionTemplate类来管理事务,代码更简洁,使用方便。
posted on 2007-08-08 21:28 扭曲的铅笔 阅读(547) 评论(0)  编辑  收藏 所属分类: Spring

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


网站导航: