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不是同一个,所以拦截不到。

相关推荐