笔者在使用注解控制事务时碰见了CRUD都不报错,sql语句有输出,但是数据库值未改变,猜测可能是事务没有提交或者没有事务。百度了一波后发现了问题所在,springMVC注解扫描是优先于spirng.xml,导致@Tractional注解没来得及对方法进行事务增强,从而导致事务没有注册。
最正确的配置方式:
在主容器中applicationContext.xml中,将Controller的注解排除掉
<context:component-scan base-package="com"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan> 而在springmvc.xml中,将Service注解给去掉 <context:component-scan base-package="com"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" /> </context:component-scan>
因为spring的context是父子容器,所以会产生冲突,由ServletContextListener产生的是父容器,springMVC产生的是子容器,子容器Controller进行扫描装配时装配了@Service注解的实例,而该实例理应由父容器进行初始化以保证事务的增强处理,所以此时得到的将是原样的Service(没有经过事务加强处理,故而没有事务处理能力。
还有一种方式是将service层改用xml配置,其实这样做也是变相的让spring

本文探讨了在Spring MVC中遇到的事务不提交和@Transactional注解无效的问题。问题源于Spring MVC注解扫描的优先级高于spring.xml,导致事务增强未生效。解决方案包括在applicationContext.xml中排除Controller注解,确保Service由父容器初始化以实现事务处理,或使用XML配置Service。测试了不同配置方式,如只配置applicationContext.xml导致@Controller失效,只配置springmvc.xml则事务失效,而在两者中正确配置则能保证事务正常。
最低0.47元/天 解锁文章
2177

被折叠的 条评论
为什么被折叠?



