关于Spring事务的理解

在使用SpringMvc的时候,配置文件中咱们常常看到 annotation-driven 这样的注解,其含义就是支持注解,通常根据前缀 tx、mvc 等也能很直白的理解出来分别的做用。tx:annotation-driven/ 就是支持事务注解的(@Transactional) 、http://www.javashuo.com/tag/mvc:annotation-driven 就是支持mvc注解的,说白了就是使Controller中可使用MVC的各类注解。html

首先,<tx:annotation-driven/>  会有一个属性来指定使用哪一个事务管理器,如:<tx:annotation-driven transaction-manager="transactionManager" />。而后事务管理器 transactionManager 会引用 dataSource (若是咱们使用JPA或Hibernate,也须要指定一个 entityManagerFactory ),dataSouce 确定就是直接对数据库的了。

这样逐层引用下去,因此咱们使用@Transactionl 注解能够控制事务就通俗易懂了。另外要提一下的就是 spring 是使用 aop 经过 asm 操做java字节码的方式来实现对方法的先后事务管理的。

说到这里,已经有了对 <tx:annotation-driven/> 的简单理解,那咱们是否就能够在程序中全部被spring管理的类上均可以使用@Transactional注解了呢,在Service上可使用[@Transactional](https://my.oschina.net/u/3770144) 注解这个是确定的了,那总有些人也想弄明白可否在Controller 使用?答案显然是“不必定”的(与时间配置有关),下面作下解释:

在 spring-framework-reference.pdf 文档上有这样一段话:java

tx:annotation-driven/ only looks for @Transactional on beans in the same application context it is defined in. This means that, if you put tx:annotation-driven/ in a WebApplicationContext for a DispatcherServlet, it only checks for @Transactional beans in your controllers, and not your services.spring

意思就是:tx:annoation-driven/只会查找和它在相同的应用上下文件中定义的bean上面的@Transactional注解,若是你把它放在Dispatcher的应用上下文中,它只检查控制器(Controller)上的@Transactional注解,而不是你services上的@Transactional注解。数据库

因此,能够肯定的是咱们是能够在Controller上使用事务注解的,可是咱们不推荐这样作(本人也历来没有这样作过),这里只是为了说明spring对<tx:annotation-driven/>的使用。

通常的配置方法是让Spring管理除了Controller注解之外注解,而让SpringMVC单纯管理Controller注解。 也就是说Spring有一个配置文件,里面配置成扫描非Controller的bean,SpringMVC有一个配置文件,里面只扫描Controller。 这样就造成了两个上下文,即Spring的上下文和SpringMVC的上下文,他们分别管理着不一样的俩堆bean。mvc

这个时候你在Spring的配置文件里加了一句tx:annoation-driven,实际上是告诉Spring,你管理的这些bean里面有可能会出现须要事务支持的。 而后在Spring管理范围的某个bean上加了个注解@transactional,实际上是用来帮助Spring识别这个bean是须要事务管理的。app

一样你在Spring的配置文件里加了tx:annoation-driven,SpringMVC是不关心的,他只关心你给他配置了什么以及他管理的bean上有什么注解spa

连接

https://www.cnblogs.com/darknebula/p/9963859.html.net

相关文章
相关标签/搜索