分享

spring声明式事务管理

 我心永恒lz 2015-09-07

 一、配置

配置文件  

1. <!-- 定义事务管理器 -->   

2. <bean id="transactionManager" 

3.            class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  

4.       <property name="dataSource" ref="dataSource"/>  

5. </bean>  

6. 

7.  <tx:advice id="txAdvice" transaction-manager="transactionManager">  

8.         <tx:attributes>  

9.             <!-- 读取数据方法,一般采用只读事务-->  

10.             <tx:method name="get*" read-only="true" />  

11.             <tx:method name="query*" read-only="true" />  

12.             <tx:method name="find*" read-only="true" />  

13.             <tx:method name="load*" read-only="true" />  

14.               

15.             <!--saveupdateinsert等为前缀的方法对数据库进行写入操作时,当产生Exception时进行回滚 -->  

16.             <tx:method name="insert*"  rollback-for="Exception"  />  

17.             <tx:method name="update*" rollback-for="Exception"  />  

18.             <tx:method name="save*"  rollback-for="Exception"  />  

19.             <tx:method name="add*"  rollback-for="Exception"  />  

20.             <tx:method name="create*"   rollback-for="Exception"  />  

21.             <tx:method name="del*" rollback-for="Exception"  />  

22.             <tx:method name="remove*" rollback-for="Exception" />  

23.                  <!--对所有方法,修改为抛出异常都进行回滚 -->  

24.             <tx:method name="*" rollback-for="Exception"/>   

25.         </tx:attributes>  

26.   </tx:advice>  

27.  <!-- 指定事务切入点 -->  

28.  <aop:config>  

29.         <aop:advisor  pointcut="execution(* cn.myshop.service.*.*(..))"   advice-ref="txAdvice" />  

30.  </aop:config> 

二、事务回滚失败可能的原因
1mysql默认存储引擎为MyISAM是不支持事务,需要设置为InnoDB模式。可以通过show engines 命令查看数据库的存储引擎。

 

2Spring MVC启动时的配置文件,包含组件扫描、url映射以及设置freemarker参数,让spring不扫描带有@Service注解的类。为什么要这样设置?因为servlet-context.xml与service-context.xml不是同时加载,如果不进行这样的设置,那么,spring就会将所有带@Service注解的类都扫描到容器中,等到加载service-context.xml的时候,会因为容器已经存在Service类,使得cglib将不对Service进行代理,直接导致的结果就是在service-context中的事务配置不起作用,发生异常时,无法对数据进行回滚。

1.  1.root-context.xml   

2. <!-- 不扫描带有@Controller注解的类。因为这些类已经随容器启动时,在servlet-context中扫描过一遍了 -->   

3. <context:component-scan base-package="com.kimho">   

4. <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>   

5. </context:component-scan>   

6.   

7. 2servlet-context.xml:   

8. <!-- 扫描业务组件,spring不扫描带有@Service注解的类(留在root-context.xml中扫描@Service注解的类),防止事务失效 -->   

9. <context:component-scan base-package="com.kimho">   

10. <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>   

11. </context:component-scan>   

 


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多