Spring mvc下的事务管理 不起作用
最近公司要搞一个框架,把这活落在了我的身上,正好那段时间在研究Spring mvc,感觉其注解式Controller比较强大,就准备开发一个Spring mvc框架,但是在测试Spring的事务管理时,发现其不起作用,后来搞了将近一个星期,终于弄好了,不过一部分还是不是很明白,希望有大神帮我解决我的疑问:
1,tx:advice的解析类是哪个?
2,最终开启事物以及关闭事物的操作事物类是不是TransactionInterceptor?
现在把我解决问题的过程写一下。本人小菜,仅希望留下痕迹。
开始我配置Spring事物的配置文件是这样的;
<tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="save*" propagation="REQUIRED"/> <tx:method name="add*" propagation="REQUIRED"/> <tx:method name="create*" propagation="REQUIRED"/> <tx:method name="insert*" propagation="REQUIRED"/> <tx:method name="update*" propagation="NEVER"/> <tx:method name="merge*" propagation="REQUIRED"/> <tx:method name="remove*" propagation="REQUIRED"/> <tx:method name="put*" propagation="REQUIRED" /> <tx:method name="get*" propagation="SUPPORTS" read-only="true"/> <tx:method name="del*" propagation="REQUIRED"/> <tx:method name="count*" propagation="SUPPORTS" read-only="true"/> <tx:method name="find*" propagation="SUPPORTS" read-only="true"/> <tx:method name="load*" propagation="SUPPORTS" read-only="true"/> <tx:method name="query*" propagation="SUPPORTS" read-only="true"/> <tx:method name="list*" propagation="SUPPORTS" read-only="true"/> <tx:method name="*" propagation="SUPPORTS" read-only="true" /> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut expression="execution(* com.project..*Service.*(..))" id="txPointcut"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/> </aop:config>
拦截所有的以Service结尾的接口方法,且web.xml中是这样配置的,以下是其中一部分。
<context-param> <param-name>contextConfigLocation</param-name> <param-value> WEB-INF/conf/applicationProperties.xml, WEB-INF/conf/applicationDataSource.xml, WEB-INF/conf/applicationTransaction.xml, WEB-INF/conf/applicationSecurity.xml, WEB-INF/conf/applicationService.xml </param-value> </context-param> ......................... <!-- spring mvc 配置--> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- spring 配置文件,名称的路径都可以配置,如果不配置此项则自动扫描/WEB-INF/ springmvc-servlet.xml,此文件名规则为servlet名-servlet.xml --> <init-param> <param-name>namespace</param-name> <param-value>conf/springmvc-servlet</param-value> <!-- 加载多个配置文件 --> </init-param> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/conf/applicationContext.xml</param-value> </init-param> <!--servlet加载方式,启动容器时加载--> <load-on-startup>1</load-on-startup> </servlet>
此时发现根本就没办法拦截service中的方法,在service中插入数据错误是,也不能回滚。我在TransactionInterceptor中设置断点,也无法进入。
通过查找资料,个人初步判断如下:
Spring事物管理只会在当前同一个ApplicationContext中拦截事物,如果其上下文不在同一个ApplicationContext中的话,事物不能拦截到。由于我配置在<context-param>事物拦截,而想在<servlet>中拦截事物,导致其ApplicationContext不是同一个,所以拦截不到。
相关推荐
LeeLuffy 2020-10-16
打不死的小强 2020-07-03
zbcaicai 2020-06-21
花落花开春去秋来 2020-06-20
loviezhang 2020-06-16
林大鹏 2020-06-10
feinifi 2020-11-12
jakefei 2020-07-19
云之飞踢 2020-07-08
lpfvip00 2020-06-25
msmysql 2020-06-21
wenjieyatou 2020-06-09
middleware0 2020-06-09
CharlesYooSky 2020-06-06
pengpengflyjhp 2020-05-14
debugjoker 2020-04-10
zhangll00 2020-05-11
xiaoxiangyu 2020-04-30
huolan 2020-04-27