- 内容简介
- 前言
- 第 1 章 第一个 Spring Boot 项目
- 第 2 章 集成 MySQL 数据库
- 第 3 章 集成 Spring Data JPA
- 第 4 章 使用 Thymeleaf 模板引擎
- 第 5 章 Spring Boot 事务支持
- 第 6 章 使用过滤器和监听器
- 第 7 章 集成 Redis 缓存
- 第 8 章 集成 Log4j 日志
- 8.3 使用 Log4j 记录日志
- 第 9 章 Quartz 定时器和发送 Email
- 第 10 章 集成 MyBatis
- 第 11 章 异步消息与异步调用
- 第 12 章 全局异常处理与 Retry 重试
- 第 13 章 集成 MongoDB 数据库
- 第 14 章 集成 Spring Security
- 第 15 章 Spring Boot 应用监控
- 第 16 章 集成 Dubbo 和 Zookeeper
- 第 17 章 多环境配置与部署
- 第 18 章 Spring Boot 原理解析
- 参考文献
5.2 Spring Boot 事务的使用

5.2.1 Spring Boot 事务介绍
Spring Boot 开启事务很简单,只需要一个注解 @Transactional 就可以了,因为在 Spring Boot 中已经默认对 JPA、JDBC、Mybatis 开启了事务,引入它们依赖的时候,事物就默认开启。当然,如果你需要用其他的 ORM 框架,比如 BeatlSQL,就需要自己配置相关的事物管理器。
Spring Boot 用于配置事务的类为 TransactionAutoConfiguration,此配置类依赖于 JtaAutoConfiguration 和 DataSourceTransactionManagerAutoConfiguration,具体查看源代码可知,而 DataSourceTransactionManagerAutoConfiguration 开启了对声明式事务的支持,所以在 Spring Boot 中,无须显示开启使用 @EnableTransactionManagement。
5.2.2 类级别事务
在第 3 章中,我们已经在 Spring Boot 中集成了 Spring Data JPA,同时开发了 AyUserRepository 类实现 JpaRepository 接口,JpaRepository 接口是不开启事务的,而 SimpleJapRepository 默认是开启事务的,所以我们需要手工给 AyUserRepository 添加事务。AyUserRepository 类中的方法是在服务层类 AyUserServiceImpl 中被使用,而事务一般都是加在服务层,因此我们可以在 AyUserServiceImpl 类上添加 @Transactional 注解来开启事务。AyUserServiceImpl 类开启事务的代码如下:
@Transactional 注解在类上,意味着此类的所有 public 方法都是开启事务的。
5.2.3 方法级别事务
@Transactional 除了可以注解在类上,还可以注解到方法上面。当注解在类上时,意味着此类的所有 public 方法都是开启事务的。如果类级别和方法级别同时使用了 @Transactional 注解,就使用方法级别注解覆盖类级别注解。我们可以给 AyUserServiceImpl 类中的 save() 方法添加事务,同时在 save 完成之后抛 NullPointException 异常,查看数据是否可以回滚,具体代码如下:
5.2.4 测试
5.2.1 节和 5.2.2 节的代码开发完成之后,我们在测试类 MySpringBootApplicationTests 中添加测试方法,具体代码如下:
@Test public void testTransaction(){ AyUser ayUser = new AyUser(); ayUser.setId("3"); ayUser.setName(" 阿华"); ayUser.setPassword("123"); ayUserService.save(ayUser); }
运行 testTransaction() 单元测试用例,当代码执行完成后,由于方法 save 保持数据时出现空指针,数据会回滚,因此在数据库中查询不到保存的数据。现在把 AyUserServiceImpl 类上的 @ Transactional 注解和 save 方法上的 @ Transactional 注解全部注释掉,再次执行 testTransaction() 单元测试用例,查询数据库,发现数据库多了一条数据,如图 5-1 所示。
图 5-1 将数据插入数据库
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论