Spring Boot 2系列(九):Transaction(事务)的支持
要理解 Spring Boot 的事务,必须先理解 Spring 的事务机制,可以参考Spring事务机制。
自动配置的事务管理器
JDBC访问
Spring Boot 已经定义了实现 PlatformTransactionManager接口的 DataSourceTransactionManager 的 Bean, 配置在org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration类文件中。
DataSourceTransactionManager 继承自抽象类 AbstractPlatformTransactionManager,抽象类实现了 PlatformTransactionManager 这个统一的接口。
1 |
|
JPA访问
Spring Boot Jpa 是基于 Hibernate 实现的,在org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration类文件里定义了 PlatformTransactionManager 接口的实现 JpaTransactionManager 的 Bean 。
1 |
|
在自动配置类 org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration 引入了 HibernateJpaConfiguration,自动配置了 JPA
的事务。
Transactional自动配置
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration事务自动配置依赖于 JtaAutoConfiguration,HibernateJpaAutoConfiguration,DataSourceTransactionManagerAutoConfiguration自动配置的事务,还开启了声明式事务的支持。
1 |
|
事务使用
在 Spring Boot中,无须显式使用@EnableTransactionManagement
注解来开启事务支持,Spring Boot 通过自动配置,默认就提供了事务的支持,在实际开发中,只需在业务层的类或方法上添加@Transactional
注解即可启用事务(相当于XML中的<tx:annotation-driven/>
配置方式)。
事务一般是在一条sqlSession
里执行多表或多条SQL操作时需要用到。在程序执行遇到运行时异常并抛出异常时才会触发事务,在实际开发中抛出异常还得在Controller
捕获异常并做最终的处理。
开发时,一般在业务层使用try...catch....
捕获异常,在catch
里面抛出异常来触发事务,在控制层同样使用try...catch....
接收异常,在catch
里处理异常并转换为用户可识别的异常消息。
业务层
- 业务层
方法上添加**@Transactional**注解启用事务,捕获并抛出异常来触发事务1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class UserServerImpl{
private UserMapper userMapper;
public void addUser(User user) {
try {
userMapper.insertUser(user);
userMapper.insertUserAddress(user.getAddress());
} catch (Exception e) {
throw e;
}
}
} - 控制层
捕获业务层抛出的异常,在catch里处理异常转换为可识别的异常消息。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class UserController {
private UserService userService;
public RespResult saveUser(User user) {
RespResult respResult = new RespResult();
try {
userService.saveUser(user);
respResult.setState(true).setCodeAndMsg(ResultCodeAndMsg.SUCCESS);
} catch (Exception e) {
respResult.setState(false).setCode(4001).setMsg("保存用户失败");
}
return respResult;
}
}
分布式事务框架
在此备注,后续研究
- spring-boot-starter-jta-atomikos
- spring-boot-stater-jta-bitronix
Spring Boot 2系列(九):Transaction(事务)的支持
http://blog.gxitsky.com/2018/05/30/SpringBoot-09-transaction/