zyskm用梦想丈量人生,用奔跑丈量激情

spring声明性事务常见问题分析(续)

上一篇说明了一种spring事务配置方式,这次补上另一种。
见配置文件:
<!-- 事务拦截 -->
    
<tx:advice id="txAdvice" transaction-manager="transactionManager">
        
<tx:attributes>
            
<tx:method name="get*" propagation="REQUIRED" read-only="true" />
            
<tx:method name="find*" propagation="REQUIRED" read-only="true" />
            
<tx:method name="search*" propagation="REQUIRED" read-only="true" />
            
<tx:method name="save*" propagation="REQUIRED" />
            
<tx:method name="modify*" propagation="REQUIRED" />
            
<tx:method name="send*" propagation="REQUIRED" />
            
<tx:method name="revoke*" propagation="REQUIRED" />
            
<tx:method name="del*" propagation="REQUIRED" />
            
<tx:method name="logging*" propagation="NOT_SUPPORTED" read-only="true" />
            
<tx:method name="*" propagation="SUPPORTS" read-only="true"  />
        
</tx:attributes>
    
</tx:advice>
    
<aop:config>
        
<aop:pointcut id="projectServiceOperation" expression="execution(* cn.ceopen.bss..*.service..*(..))" />
        
<aop:advisor pointcut-ref="projectServiceOperation" advice-ref="txAdvice" />
    
</aop:config>

重点说明两点:
1.<aop:pointcut id="projectServiceOperation" expression="execution(* cn.ceopen.bss..*.service..*(..))" />
表示你要进行事务控制的类名。详细资料可以查下 aspectj语法。
配置完成一定要实际测试一下,我配置过 expression="execution(* cn.ceopen.bss..*.service.*(..))" 少了一个点,导致事务不起作用。
导致项目很长一段时间事务方面没经过严格测试。
2.
Spring的AOP事务管理默认是针对unchecked exception回滚。
也就是默认对RuntimeException()异常极其子类进行事务回滚。
在项目中定义公共的RuntimeException异常,避免每个开发人员随意抛出异常。
不然的话没新定义一个异常,就要修改tx:method rollback-for 太麻烦了。

总结:
1.对事务配置进行检查,对复杂嵌套的事务逻辑必要的时候debug到spring源码中确认。
2.定义统一异常类型
3.同一个类调用自身方法,子方法的事务配置不起作用。解决方法见上一篇文章。
http://www.blogjava.net/zyskm/archive/2011/11/11/363535.html

作者: zyskm
本文地址:
http://www.blogjava.net/zyskm/archive/2011/11/30/365225.html

posted on 2011-11-30 17:35 zyskm 阅读(3277) 评论(0)  编辑  收藏


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


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问