Spring事务配置笔记(实现不同Service间调用事务)

53 篇文章 0 订阅

Spring事务配置笔记(实现不同Service间调用事务)

一、关键配置示例:

< bean  id ="sessionFactory"
        class
="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
        
< property  name ="dataSource" >
            
< ref  local ="dataSource"   />
        
</ property >
    
        
<!--  bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"/ -->
    
< bean  id ="transactionManager"  class ="org.springframework.orm.hibernate3.HibernateTransactionManager" >
        
< property  name ="sessionFactory" >
            
< ref  local ="sessionFactory"   />
        
</ property >
    
</ bean >

    
<!--  Hibernate Transaction Interceptor Definition  -->
    
< bean  id ="hibernateTransactionInterceptor"
        class
="org.springframework.transaction.interceptor.TransactionInterceptor"
        parent
="transactionIntercetorTemplate" >
        
< property  name ="transactionManager" >
            
< bean  id ="hibernateTransactionManager"
                class
="org.springframework.orm.hibernate3.HibernateTransactionManager" >
                
< property  name ="sessionFactory" >
                    
< ref  bean ="sessionFactory"   />
                
</ property >
            
</ bean >
        
</ property >
    
</ bean >

    
<!--  Transction Intercetor's Template  -->
    
< bean  id ="transactionIntercetorTemplate"  abstract ="true" >
        
< property  name ="transactionAttributes" >
            
< props >
                
< prop  key ="get*" > PROPAGATION_REQUIRED,readOnly </ prop >
                
< prop  key ="is*" > PROPAGATION_REQUIRED,readOnly </ prop >
                
< prop  key ="check*" > PROPAGATION_REQUIRED,readOnly </ prop >
                
< prop  key ="insert*" > PROPAGATION_REQUIRED </ prop >
                
< prop  key ="update*" > PROPAGATION_REQUIRED </ prop >
                
< prop  key ="delete*" > PROPAGATION_REQUIRED,-BussException </ prop >
                
< prop  key ="*" > PROPAGATION_REQUIRED </ prop >
            
</ props >
        
</ property >
    
</ bean >

    
<!--  定义自动代理生成器 -->
    
< bean  id ="autoProxyCreator"
        class
="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator" >
        
< property  name ="interceptorNames" >
            
< list >
                
< idref  bean ="hibernateTransactionInterceptor"   />
                
< idref  bean ="jdbcTransactionInterceptor"   />
            
</ list >
        
</ property >
        
< property  name ="beanNames" >
            
< value > *Service </ value >  
            
<!-- list>
                <idref bean="bookService" />                                        
            </list
--> [来源www.iocblog.net]
            
<!-- 添加Service bean -->
        
</ property >
    
</ bean >
    
< bean  id ="hibernateDaoTemplate"  abstract ="true" >
        
< property  name ="sessionFactory" >
            
< ref  bean ="sessionFactory"   />
        
</ property >
    
</ bean >
    
<!--  Dao 定义  -->
    
< bean  id ="imageDao"  class ="com.fbyssssite.dao.ImageDao"
        parent
="hibernateDaoTemplate"   />
    < bean  id ="imageFolderDao"  class ="com.fbyssssite.dao.ImageFolderDao"
        parent
="hibernateDaoTemplate"   />
    
<!--  Service 定义  -->
    
< bean  id ="imageService"  class ="com.fbyssssite.bo.ImageService"  autowire ="byName" >
        
< property  name ="dao"  ref ="imageDao" ></ property >
    
</ bean >     
    < bean  id ="imageFolderService"  class ="com.fbyssssite.bo.ImageFolderService"  autowire ="byName" >
        
< property  name ="dao"  ref ="imageFolderDao" ></ property >
    
</ bean >     

二、测试代码:

public   void  delete(Object entity,IBaseUser user)  throws  BussException  {
   
super .delete(entity, user);
   ImageFolder folder 
=  (ImageFolder)entity;
   String folderId 
=  folder.getId();   
   IImageService imageService  
=  ServiceFactory.getImageService();
   imageService.deleteAllInFolder(folderId,user);   
  }

  
public   void  deleteAllInFolder(String id,IBaseUser sysUser)  throws  BussException  {
   log.info(
" 删除图片夹' " + id + " '中的图片... " );
   
throw   new  BussException( 1 , " 临时测试:测试事务是否生效的异常。测试完毕后删除此语句。 " ,log);
   
/*
   StringBuffer sql = new StringBuffer("delete ");
   sql.append("from ");
   sql.append(getEntityClassName());
   SqlBuilder sqlBuilder  = SqlBuilder.getInstance();
   sqlBuilder.appendWhereCondition(sql, "folderId='"+id+"'");
   bulkUpdate(sql.toString(), sysUser);
   
*/
   
  }


三、测试效果:
抛出BussException之后,imageFolder实体并没有被删除,而是回滚了。
四、注意事项:
1. 其中的 BussException是一个CheckedException(继承自Exception),这里 不过是一个例子,如果其他方法需要同样的方式处理事务,也要加上-BussException,否则不能回滚;如果是一个 UnCheckedException,就不需要在这里配置,默认就会回滚。
2. 如果采用MySQL,show table status可以查看表的ENGINE类型,MyISAM是不支持事务的,如果需要事务,应该改成InnoDB:alter table [tablename] engine = InnoDB;

 

http://www.iocblog.net/project/springmvc/springmvc-756.html


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值