(十三)如何实现事务

Posted youngdeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(十三)如何实现事务相关的知识,希望对你有一定的参考价值。

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

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

 

为什么要事务

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

技术图片

 

事务播行为

Propagation.REQUIRED -- 支持当前事务,如果当前没有事务,就新建一个事务,最常见的选择。
Propagation.SUPPORTS -- 支持当前事务,如果当前没有事务,就以非事务方式执行
Propagation.MANDATORY -- 支持当前事务,如果当前没有事务,就抛出异常。
Propagation.REQUIRES_NEW -- 新建事务,如果当前存在事务,把当前事务挂起, 两个事务之间没有关系,一个异常,一个提交,不会同时回滚。
Propagation.NOT_SUPPORTED -- 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
Propagation.NEVER -- 以非事务方式执行,如果当前存在事务,则抛出异常

如何实现

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表中数据如下:

技术图片

 

 在浏览器中数据:http://localhost:8080/mybatis/saveUserTransactional,也没返回执行异常,数据库中的数据也没有变化,说明数据已经回滚了:

技术图片

 

 

最后

以上,就把Spring Boot中事物控制讲完了,是不是特别简单。

这个系列课程的完整源码,也会提供给大家。大家关注我的微信公众号(架构师精进),回复:springboot源码。获取这个系列课程的完整源码。

以上是关于(十三)如何实现事务的主要内容,如果未能解决你的问题,请参考以下文章

我如何从一个片段到另一个片段的列表视图适配器进行事务

如何使用事务回栈来弹出片段?

如何绕过将数据模型传递给片段参数以避免事务太大异常?

回栈事务后如何持久化分片数据?

片段事务中的实例化错误

BottomNavigationView 滞后于片段事务