一、配置
配置文件
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. <!--以save、update、insert等为前缀的方法对数据库进行写入操作时,当产生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>
二、事务回滚失败可能的原因
1、mysql默认存储引擎为MyISAM是不支持事务,需要设置为InnoDB模式。可以通过show engines 命令查看数据库的存储引擎。
2、Spring 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. 2、servlet-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>
联系客服