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