Spring Boot 揭秘与实战(二) 数据存储篇 - 声明式事务管理

文章目录

  1. 1. 声明式事务
  2. 2. Spring Boot默认集成事务
  3. 3. 实战演练4. 源代码
    1. 3.1. 实体对象
    2. 3.2. DAO 相关
    3. 3.3. Service 相关
    4. 3.4. 测试,测试

本文讲解 Spring Boot 如何使用声明式事务管理。

声明式事务

Spring 支持声明式事务,使用 @Transactional 注解在方法上表明这个方法需要事务支持。此时,Spring 拦截器会在这个方法调用时,开启一个新的事务,当方法运行结束且无异常的情况下,提交这个事务。

Spring 提供一个 @EnableTransactionManagement 注解在配置类上来开启声明式事务的支持。使用了 @EnableTransactionManagement 后,Spring 会自动扫描注解 @Transactional 的方法和类。

Spring Boot默认集成事务

Spring Boot 默认集成事务,所以无须手动开启使用 @EnableTransactionManagement 注解,就可以用 @Transactional注解进行事务管理。我们如果使用到 spring-boot-starter-jdbc 或 spring-boot-starter-data-jpa,Spring Boot 会自动默认分别注入
DataSourceTransactionManager 或 JpaTransactionManager。

实战演练

我们在前文「Spring Boot 揭秘与实战(二) 数据存储篇 - MySQL」的案例上,进行实战演练。

实体对象

我们先创建一个实体对象。为了便于测试,我们对外提供一个构造方法。

  1. public class Author {
  2. private Long id;
  3. private String realName;
  4. private String nickName;
  5. public Author() {}
  6. public Author(String realName, String nickName) {
  7. this.realName = realName;
  8. this.nickName = nickName;
  9. }
  10. // SET和GET方法
  11. }

DAO 相关

这里,为了测试事务,我们只提供一个方法新增方法。

  1. @Repository("transactional.authorDao")
  2. public class AuthorDao {
  3. @Autowired
  4. private JdbcTemplate jdbcTemplate;
  5. public int add(Author author) {
  6. return jdbcTemplate.update("insert into t_author(real_name, nick_name) values(?, ?)",
  7. author.getRealName(), author.getNickName());
  8. }
  9. }

Service 相关

我们提供三个方法。通过定义 Author 的 realName 字段长度必须小于等于 5,如果字段长度超过规定长度就会触发参数异常。

值得注意的是,noRollbackFor 修饰表明不做事务回滚,rollbackFor 修饰的表明需要事务回滚。

  1. @Service("transactional.authorService")
  2. public class AuthorService {
  3. @Autowired
  4. private AuthorDao authorDao;
  5. public int add1(Author author) {
  6. int n = this.authorDao.add(author);
  7. if(author.getRealName().length() > 5){
  8. throw new IllegalArgumentException("author real name is too long.");
  9. }
  10. return n;
  11. }
  12. @Transactional(noRollbackFor={IllegalArgumentException.class})
  13. public int add2(Author author) {
  14. int n = this.authorDao.add(author);
  15. if(author.getRealName().length() > 5){
  16. throw new IllegalArgumentException("author real name is too long.");
  17. }
  18. return n;
  19. }
  20. @Transactional(rollbackFor={IllegalArgumentException.class})
  21. public int add3(Author author) {
  22. int n = this.authorDao.add(author);
  23. if(author.getRealName().length() > 5){
  24. throw new IllegalArgumentException("author real name is too long.");
  25. }
  26. return n;
  27. }
  28. }

测试,测试

  1. @RunWith(SpringJUnit4ClassRunner.class)
  2. @SpringApplicationConfiguration(WebMain.class)
  3. public class TransactionalTest {
  4. @Autowired
  5. protected AuthorService authorService;
  6. //@Test
  7. public void add1() throws Exception {
  8. authorService.add1(new Author("梁桂钊", "梁桂钊"));
  9. authorService.add1(new Author("LiangGzone", "LiangGzone"));
  10. }
  11. //@Test
  12. public void add2() throws Exception {
  13. authorService.add2(new Author("梁桂钊", "梁桂钊"));
  14. authorService.add2(new Author("LiangGzone", "LiangGzone"));
  15. }
  16. @Test
  17. public void add3() throws Exception {
  18. authorService.add3(new Author("梁桂钊", "梁桂钊"));
  19. authorService.add3(new Author("LiangGzone", "LiangGzone"));
  20. }
  21. }

我们分别对上面的三个方法进行测试,只有最后一个方法进行了事务回滚。

源代码

相关示例完整代码: springboot-action

(完)

如果觉得我的文章对你有帮助,请随意打赏。

时间: 2024-10-03 12:31:46

Spring Boot 揭秘与实战(二) 数据存储篇 - 声明式事务管理的相关文章

全面分析 Spring 的编程式事务管理及声明式事务管理--转

开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本教程假定您已经掌握了 Java 基础知识,并对 Spring 有一定了解.您还需要具备基本的事务管理的知识,比如:事务的定义,隔离级别的概念,等等.本文将直接使用这些概念而不做详细解释.另外,您最好掌握数据库的基础知识,虽然这不是必须. 系统需求 要试验这份教程中的工具和示例,硬件配置需求为:至少带

spring事物配置,声明式事务管理和基于@Transactional注解的使用

参考来源:http://blog.csdn.net/bao19901210/article/details/41724355 事物管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的一致性. spring支持编程式事务管理和声明式事务管理两种方式. 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager.对于编程式事务管理,spring推荐使用TransactionTemplate. 声明式事务管理建立在A

分析 Spring 的编程式事务管理及声明式事务管理(转)

开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本教程假定您已经掌握了 Java 基础知识,并对 Spring 有一定了解.您还需要具备基本的事务管理的知识,比如:事务的定义,隔离级别的概念,等等.本文将直接使用这些概念而不做详细解释.另外,您最好掌握数据库的基础知识,虽然这不是必须. 系统需求 要试验这份教程中的工具和示例,硬件配置需求为:至少带

Spring 的编程式事务管理及声明式事务管理

本文将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. Spring 事务属性分析 事务管理对于企业应用而言至关重要.它保证了用户的每一次操作都是可靠的,即便出现了异常的访问情况,也不至于破坏后台数据的完整性.就像银行的自助取款机,通常都能正常为客户服务,但是也难免遇到操作过程中机器突然出故障的情况,此时,事务就必须确保出故障前对账户的操作不生效,就像用户刚才完全没有使用过取款机一样,以保

Spring Boot 揭秘与实战(二) 数据存储篇 - MongoDB

文章目录 1. 环境依赖 2. 数据源 2.1. 方案一 使用 Spring Boot 默认配置 2.2. 方案二 手动创建 3. 使用mongoTemplate操作4. 总结 3.1. 实体对象 3.2. DAO相关 3.3. Service相关 3.4. Controller相关 5. 源代码 本文讲解Spring Boot基础下,如何使用MongoDB,编写数据访问. 环境依赖 修改 POM 文件,添加spring-boot-starter-data-mongodb依赖. <depende

Spring Boot 揭秘与实战(二) 数据存储篇 - Redis

文章目录 1. 环境依赖 2. 数据源 2.1. 方案一 使用 Spring Boot 默认配置 2.2. 方案二 手动创建 3. 使用 redisTemplate 操作4. 总结 3.1. 工具类 3.2. 测试类 3.3. 单元测试用例 5. 源代码 本文讲解Spring Boot基础下,如何整合Redis,编写数据访问. 环境依赖 修改 POM 文件,添加 spring-boot-starter-redis 依赖. <dependency> <groupId>org.spri

Spring Boot 揭秘与实战(二) 数据存储篇 - ElasticSearch

文章目录 1. 版本须知 2. 环境依赖 3. 数据源 3.1. 方案一 使用 Spring Boot 默认配置 3.2. 方案二 手动创建 4. 业务操作5. 总结 4.1. 实体对象 4.2. DAO相关 4.3. Service相关 4.4. Controller相关 6. 源代码 本文讲解Spring Boot基础下,如何使用 ElasticSearch,实现全文搜索. 版本须知 spring data elasticSearch 的版本与Spring boot.Elasticsearc

Spring Boot 揭秘与实战(二) 数据缓存篇 - 快速入门

文章目录 1. 声明式缓存 2. Spring Boot默认集成CacheManager 3. 默认的 ConcurrenMapCacheManager 4. 实战演练5. 扩展阅读 4.1. Maven 依赖 4.2. 开启缓存支持 4.3. 服务层 4.4. 控制层 4.5. 运行 4.6. 课后作业 6. 源代码 为了提高性能,减少数据库的压力,使用缓存是非常好的手段之一.本文,讲解 Spring Boot 如何集成缓存管理. 声明式缓存 Spring 定义 CacheManager 和

Spring Boot 揭秘与实战(九) 应用监控篇 - HTTP 应用监控

文章目录 1. 快速开始 2. 监控和管理端点3. 定制端点 2.1. health 应用健康指标 2.2. info 查看应用信息 2.3. metrics 应用基本指标 2.4. trace 基本的HTTP跟踪信息 2.5. shutdown关闭当前应用 4. 源代码 Spring Boot 提供运行时的应用监控和管理功能.本文,我们通过 HTTP 实现对应用的监控和管理. 快速开始 Spring Boot 监控核心是 spring-boot-starter-actuator 依赖,增加依赖