一、配置 配置文件 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> 二、事务回滚失败可能的原因 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>
|
|