事务的作用就是为了保证用户的每一个操作都是可靠的,事务中的每一步操作都必须成功执行,只要有发生异常就会退到事务开始未进行操作的状态。
事务管理是Spring框架中最为常用的功能之一,我们在使用Spring Boot开发应用时,一些业务场景也需要使用事务。
一、Spring boot中的自动配置
spring boot与spring mvc的一个重要区别就是spring boot遵循“约定优于配置”这一原则,而spring-boot-autoconfigure模块正是完美的实现这个原则。
spring boot autoconfigure的本质就是自动配置spring的各种bean,然后使应用可以通过@Autowired等注入方式来直接使用bean。
Spring boot 启动应用入口已经添加了@SpringBootApplication注解,所以不必再写@EnableAutoConfiguration注解了。
那spring boot是如何实现自动配置的?它怎么知道需要加载哪些AutoConfiguration?
这个其实是用到了spring-factories机制,这里简单说一下它在autoconfigure中的应用,我们直接来看一下spring-boot-autoconfigure-2.2.2.RELEASE.jar包下的spring.factories文件。
key是org.springframework.boot.autoconfigure.EnableAutoConfiguration,value是每个以逗号隔开的AutoConfiguration,结合spring-factories的运行原理,所有的自动配置是从这里开始加载的。
TransactionAutoConfiguration是Spring Boot关于事务的自动配置类。它仅在类PlatformTransactionManager存在于classpath上时生效。
在TransactionAutoConfiguration 类中,已通过 @EnableTransactionManagement注解开启事务。
在Spring Boot中,当我们使用了spring-boot-starter-jdbc或spring-boot-starter-data-jpa依赖的时候,框架会自动默认分别注入DataSourceTransactionManager或JpaTransactionManager,所以我们不需要任何额外配置就可以用@Transactional注解进行事务的使用。
在pom.xml 文件中,当我们添加mybatis 依赖包时,会自动添加对spring-boot-starter-jdbc的依赖,如下所示:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
这样,在spring boot项目中,就会自动注入DataSourceTransactionManager。
DataSourceTransactionManager 将会拦截标注有@Transactional注解的方法。因此,之前使用的@EnableTransactionManagement注解就不必添加了。
二、声明式事务
Spring支持声明式事务,即使用注解来选择需要使用事务的方法,它使用@Transactional注解在方法上表明该方法需要事务支持。
@Transactional
public void saveSomething(Long id, String name) {
//数据库操作
}
在此处需要特别注意的是,此@Transactional注解来自org.springframework.transaction.annotation包,而不是javax.transaction。
被 @Transactional 注解的方法,将支持事务。如果注解在类上,则整个类的所有方法都默认支持事务。