事务不提交、@Tractional注解不生效等问题的一些思考

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

笔者在使用注解控制事务时碰见了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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值