zoukankan      html  css  js  c++  java
  • Spring Boot入门系列(十三)如何实现事务

    前面介绍了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源码。获取这个系列课程的完整源码。

  • 相关阅读:
    查看端口有没有被占用
    微信公众号2()
    How to insert a segment of noise to music file
    puppet practice
    Docker Commands
    LempelZiv algorithm realization
    The algorithm of entropy realization
    Java network programmingguessing game
    Deploy Openstack with RDO and Change VNC console to Spice
    puppet overview
  • 原文地址:https://www.cnblogs.com/zhangweizhong/p/12680873.html
Copyright © 2011-2022 走看看