SpringBoot从小白到精通(十三)如何实现事务保存-阿里云开发者社区

开发者社区> 章为忠学架构> 正文

SpringBoot从小白到精通(十三)如何实现事务保存

简介: Spring Boot 整合完Mybatis,有个特别重要的功能之前忘记讲了:那就是Spring Boot如何实现事物控制。在我们的实际系统中,事务会被经常用到。特别是数据库操作或者是复杂的业务操作时,必须事物执行。必须保证本次业务的处理结果更改要么都成功,要么都失败。那么这种场景下,我们改如何实现呢?
+关注继续查看

前面介绍了Spring Boot 中的整合Mybatis并实现增删改查。不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/category/1657780.html

Spring Boot 整合完Mybatis,有个特别重要的功能之前忘记讲了:那就是Spring Boot如何实现事物控制。在我们的实际系统中,事务会被经常用到。特别是数据库操作或者是复杂的业务操作时,必须事物执行。必须保证本次业务的处理结果更改要么都成功,要么都失败。那么这种场景下,我们改如何实现呢?

 

一、为什么要事务

以转账业务为例:一次转载业务涉及数据库表的两次更改。为确保业务完整性,需保证这两次更改要么都成功,要么都失败。否则账户金额就做了,后果非常严重。

image.png

 

二、事务播行为

Propagation.REQUIRED -- 支持当前事务,如果当前没有事务,就新建一个事务,最常见的选择。

Propagation.SUPPORTS -- 支持当前事务,如果当前没有事务,就以非事务方式执行

Propagation.MANDATORY -- 支持当前事务,如果当前没有事务,就抛出异常。

Propagation.REQUIRES_NEW -- 新建事务,如果当前存在事务,把当前事务挂起, 两个事务之间没有关系,一个异常,一个提交,不会同时回滚。

Propagation.NOT_SUPPORTED -- 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

Propagation.NEVER -- 以非事务方式执行,如果当前存在事务,则抛出异常


三、Spring Boot实现事务

1、首先创建Spring Boot项目,并整合Mybatis相关的依赖。这个之前的文章讲过,大家可以看我这篇文章:《Spring Boot入门系列(六)Spring Boot如何整合Mybatis【附详细步骤


2、在需要事务的方法上添加 @Transactional注解,并通过propagation指定事务机制。

修改UserServiceImpl 类和UserService类,增加 saveUserTransactional 方法。

@Override
@Transactional(propagation = Propagation.REQUIRED)
public void saveUserTransactional(SysUser user) {
    userMapper.insert(user);
    int a = 1 / 0;
    user.setIsDelete(1);
    userMapper.updateByPrimaryKeySelective(user);
}

说明:

  • propagation = Propagation.REQUIRED是默认的事务机制,若当前有事务则支持当前事务,否则新建事务。
  • springboot 开启事物很简单,只需要加注解@Transactional即可。
  • @Transactional也可以加在类上,则该类所有方法都遵循该注解配置。


 3、测试调用

在之前的MyBatisCRUDController增加测试方法:saveUserTransactional。

@RequestMapping("/saveUserTransactional")
    public JSONResult saveUserTransactional() {
        String userId = sid.nextShort();
        SysUser user = new SysUser();
        user.setId(userId);
        user.setUsername("weiz" + new Date());
        user.setNickname("weiz" + new Date());
        user.setPassword("abc123");
        user.setIsDelete(0);
        user.setRegistTime(new Date());
        userService.saveUserTransactional(user);
        return JSONResult.ok("保存成功");
    }

 

四、验证测试

首先我们看目前的sql数据中的数据,user表中数据如下:

image.png

 

然后,在浏览器中调用:http://localhost:8080/mybatis/saveUserTransactional 接口,查看数据库中数据的变化。

image.png可以看到,保存用户数据时,发生异常后,数据库中的数据也没有变化,说明数据已经回滚了。

 

最后

以上,就把Spring Boot中事物控制讲完了,是不是特别简单。这个系列课程的完整源码,也会提供给大家。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
SpringBoot中logback日志保存到mongoDB
版权声明:本文为博主武伟峰原创文章,转载请注明地址http://blog.csdn.net/tianyaleixiaowu。 前面提到过logback输出日志的多种方式,这一篇看一下自定义Appender,将logback输出的日志保存到mongo中。
1165 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4454 0
大白话聊聊分布式事务
# 大白话聊聊分布式事务 ## 什么是分布式事务 简单的来说就是,一个大的操作由两个或者更多的小的操作共同完成。而这些小的操作又分布在不同的网络主机上。这些操作,要么全部成功执行,要么全部不执行。 拿转账的例子来说下什么是分布式事务。张三和李四在不同的城市,存储他们账户信息的服务器也在不同的网络主机上。张三有30元钱,李四有30元钱。张三给李四转账5元就是一个事务。完成这个事务,需要两个
3174 0
分享工作中遇到的问题积累经验 事务日志太大导致insert不进数据
原文:分享工作中遇到的问题积累经验 事务日志太大导致insert不进数据 分享工作中遇到的问题积累经验 事务日志太大导致insert不进数据 今天开发找我,说数据库insert不进数据,叫我看一下 他发了一个截图给我 然后我登录上服务器,发现了可疑的地方,而且这个数据库之前有一段经历 在...
992 0
+关注
章为忠学架构
获取源码、资料,请关注我的微信公众号(架构师精进)
67
文章
2
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载