SpringMVC + mybatis注解式事务不回滚的原因分析@Transactional
在SpringMvc与mybatis集成过程中,遇到事务不生效的问题。经过网上查找相关资料,得以解决。记录一下。
通过web.xml确定工程中所有xml文件的加载顺序。Web.xml,如下图:

Spring容器优先加载由ServletContextListener(对应root-context.xml)产生的父容器,而SpringMVC(对应mvc_dispatcher_servlet.xml)产生的是子容器。子容器Controller进行扫描装配时装配的@Service注解的实例是没有经过事务加强处理,即没有事务处理能力的Service,而父容器进行初始化的Service是保证事务的增强处理能力的。如果不在子容器中将Service exclude掉,此时得到的将是原样的无事务处理能力的Service,因为在多上下文的情况下,
如果同一个bean被定义两次,后面一个优先。
注意:一个bean被定义两次,后面一个优先。这一点很重要,之前我就遇到这个问题,事务管理始终不好使。
先在父容器中,扫描除Controller(前提是,Controller中不需要事务管理,一般情况下Controller中也不应该有事务管理)之外的其它注解的组件,本例中是root-context.xml中配置。如下图:

网友评论