系统背景:
mybatis+spring+springmvc+mysql+BoneCPDataSource(无所谓)
只与事务有关
web.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:/applicationContext.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>springServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:/spring/spring-mvc.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
applicationContext.xml
<!-- spring容器先扫描这个包下,但不扫描controller-->
<context:component-scan base-package="com.base">
<context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation" />
</context:component-scan>
<import resource="classpath:spring/spring-*.xml"/>
spring-datasource-bonecp.xml
<bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close">
...
/>
<!-- 事务管理器 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 事务注解驱动,标注@Transactional的类和方法将具有事务性 -->
<tx:annotation-driven transaction-manager="txManager" />
spring-mvc.xml或者spring-servlet.xml
<mvc:annotation-driven />
<context:component-scan base-package="com.base.controller" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
在service dao加上@Transactional 注解就完成了service Dao的事务管理,但是controller异常的话 是不会回滚的。在spring-mvc上加上改标签 就可以实现了
<tx:annotation-driven transaction-manager="txManager" />
网上有说事务就应该在service上控制,service中可以调用多个Dao实现多个操作。我的习惯是在controller中写业务逻辑,操作多个service(这样可以直接根据不同的操作结果给与页面提示,而前者还需controller拿到service的不同结果,进行翻译,然后给页面反应),自然就需要在controlle中控制事务,感谢 https://blog.youkuaiyun.com/catoop/article/details/50067785 讲明白了我的疑惑
<tx:annoation-driven/>只会查找和它在相同的应用上下文件中定义的bean上面的@Transactional注解,如果你把它放在Dispatcher的应用上下文中,它只检查控制器(Controller)上的@Transactional注解,而不是你services上的@Transactional注解
所以,如果在controller中实现业务的话,也得在mvc中加入。
总结:
- 两个容器:
spring容器 https://www.cnblogs.com/Prozhu/p/6709320.html
对于第四点 也是可以实现的 就是在spring-mvc.xml中怎加事务管理器的配置(在spring容器和springMvc容器中都有
) - controller加事务
在spring容器和springMvc容器中都有** - 事务控制在哪一层
希望大家写出自己打高见