本文讲解 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

(完)

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

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

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

    开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本 ...

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

    http://blog.csdn.net/bao19901210/article/details/41724355 http://www.cnblogs.com/leiOOlei/p/3725911. ...

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

    开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本 ...

  4. Spring编程式事务管理及声明式事务管理

    本文将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. Spring 事务属性分析 事务管理 ...

  5. spring事务配置,声明式事务管理和基于@Transactional注解的使用(转载)

    原文地址:http://blog.csdn.net/bao19901210/article/details/41724355 事务管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的 ...

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

    文章目录 1. 版本须知 2. 环境依赖 3. 数据源 3.1. 方案一 使用 Spring Boot 默认配置 3.2. 方案二 手动创建 4. 业务操作5. 总结 4.1. 实体对象 4.2. D ...

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

    文章目录 1. 环境依赖 2. 数据源 2.1. 方案一 使用 Spring Boot 默认配置 2.2. 方案二 手动创建 3. 使用mongoTemplate操作4. 总结 3.1. 实体对象 3 ...

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

    文章目录 1. 环境依赖 2. 数据源 2.1. 方案一 使用 Spring Boot 默认配置 2.2. 方案二 手动创建 3. 使用 redisTemplate 操作4. 总结 3.1. 工具类 ...

  9. Spring Boot 揭秘与实战(二) 数据存储篇 - JPA整合

    文章目录 1. 环境依赖 2. 数据源 3. 脚本初始化 4. JPA 整合方案一 通过继承 JpaRepository 接口 4.1. 实体对象 4.2. DAO相关 4.3. Service相关 ...

随机推荐

  1. object对象转string字符串

    var obj = {}; obj=new Array; obj.name='小王'; obj.sex='男'; var str=JSON.string(obj)

  2. fastjson如何指定字段不序列化

    fastjson是一款由阿里巴巴提供的性能出色的json序列化与反序列化库,而且使用很方便,我们可以使用JSON.toJSONString(object)将一个对象序列化为json格式,但是如果我们不 ...

  3. [codechef July Challenge 2017] IPC Trainers

    IPCTRAIN: 训练营教练题目描述本次印度编程训练营(Indian Programming Camp,IPC)共请到了 N 名教练.训练营的日程安排有 M 天,每天最多上一节课.第 i 名教练在第 ...

  4. Windows下定时任务

    windows计划任务 1.写一个PHP程序,命名为test.php,内容如下所示: <? $fp = fopen("test.txt", "a+"); ...

  5. Java中的标签

    @SuppressWarnings 简介:java.lang.SuppressWarnings是J2SE 5.0中标准的Annotation之一.可以标注在类.字段.方法.参数.构造方法,以及局部变量 ...

  6. POJ 3126 Prime Path bfs, 水题 难度:0

    题目 http://poj.org/problem?id=3126 题意 多组数据,每组数据有一个起点四位数s, 要变为终点四位数e, 此处s和e都是大于1000的质数,现在要找一个最短的路径把s变为 ...

  7. 【IAP支付之三】苹果IAP安全支付与防范 receipt收据验证

    这里网上的朋友已经介绍的很详细了,具体的链接已经无法找到了. 这里主要说几点本人在开发中遇到的问题: 1.漏单必须要处理,玩家花RMB购买的东西却丢失了,是绝对不能容忍的.所谓的漏单就是玩家已经正常付 ...

  8. js的event.preventDefault()与event.stopPropagation()

    event.preventDefault()用法介绍 该方法将通知 Web 浏览器不要执行与事件关联的默认动作(如果存在这样的动作).例如,如果 type 属性是 "submit" ...

  9. [Codeforces708E]Student's Camp

    Problem 一个n*m块砖的建筑,一共k天,每天风从两边吹,吹掉砖的概率为p,反之为1-p,求最终建筑没有倒塌的可能性(上层与下层有交集且每一层都有砖) Solution 首先,我们可以预处理出p ...

  10. sqlserver指定排序字段

    在sqlserver中可以指定排序的字段,需要将哪个字段值排在最前面或最后面,都是可以的.见如下代码: SELECT * FROM public_comment order by case [User ...