(十三)如何实现事务(代码片段)

youngdeng youngdeng     2022-12-04     628

关键词:

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

一文搞懂mysqlxa如何实现分布式事务(代码片段)

一文搞懂MySQLXA如何实现分布式事务前言XA协议如何通过MySQLXA实现分布式事务前言MySQL支持单机事务的良好表现毋庸置疑,那么在分布式系统中,涉及多个节点,MySQL又是如何实现分布式事务的呢?比如开发一个业... 查看详情

一文搞懂mysqlxa如何实现分布式事务(代码片段)

一文搞懂MySQLXA如何实现分布式事务前言XA协议如何通过MySQLXA实现分布式事务前言MySQL支持单机事务的良好表现毋庸置疑,那么在分布式系统中,涉及多个节点,MySQL又是如何实现分布式事务的呢?比如开发一个业... 查看详情

一文搞懂mysqlxa如何实现分布式事务(代码片段)

一文搞懂MySQLXA如何实现分布式事务前言XA协议如何通过MySQLXA实现分布式事务前言MySQL支持单机事务的良好表现毋庸置疑,那么在分布式系统中,涉及多个节点,MySQL又是如何实现分布式事务的呢?比如开发一个业... 查看详情

(高级)shardingsphere源码分析如何实现分布式事务(代码片段)

在分析事务之前,需要先明白事务与链接的关系,一个事务可以包含多个链接(如读写分离的实现),一个链接也可以对应多个事务(如链接池化技术)。shardingsphere在快速迭代中,包结构和类结构... 查看详情

springboot系列(二十三):如何实现excel文件导入?这你得会|超级详细,建议收藏(代码片段)

👨‍🎓作者:bug菌🎉简介:在CSDN、掘金等社区优质创作者,全网合计6w粉+,对一切技术都感兴趣,重心偏java方向,目前运营公众号[猿圈奇妙屋],欢迎小伙伴们的加入,一起秃头。... 查看详情

springboot系列(二十三):如何实现excel文件导入?这你得会|超级详细,建议收藏(代码片段)

👨‍🎓作者:bug菌🎉简介:在CSDN、掘金等社区优质创作者,全网合计6w粉+,对一切技术都感兴趣,重心偏java方向,目前运营公众号[猿圈奇妙屋],欢迎小伙伴们的加入,一起秃头。... 查看详情

分布式事务是如何产生的?tx-lcn实现分布式事务(代码片段)

目录分布式事务是如何产生的?TX-LCN实现分布式事务 1、搭建事务的协调者a)导入依赖 b)在yml中配置信息 c)在主启动类开启注解 2、搭建事务的参与者a)导入依赖b)在yml中配置    c)在主启动类上开启注解d)在业务层添加分... 查看详情

每日刷题记录(十三)(代码片段)

文章目录第一题:剑指OfferII015.字符串中的所有变位词解题思路:代码实现:第二题:剑指OfferII025.链表中的两数相加解题思路:代码实现:第三题:剑指OfferII026.重排链表解题思路:代码实现:第四题:剑指OfferII030.插入、删除和随机访问都是... 查看详情

数据库事务——事务隔离级别(代码片段)

...f1a;3.SERIALIZABLE:MySQL事务小细节事务可以嵌套吗?如何实现可重复读?如何解决幻读问题?MySQL事务的回滚数据库的事务隔离级别SQL标准 查看详情

数据库事务——事务隔离级别(代码片段)

...f1a;3.SERIALIZABLE:MySQL事务小细节事务可以嵌套吗?如何实现可重复读?如何解决幻读问题?MySQL事务的回滚数据库的事务隔离级别SQL标准 查看详情

如何在dapper.net中使用事务?(代码片段)

...务化,但我看dapper并没有提供类似的方式。请问我该如何使用dapper来做这项工作呢?回答区NewteqDeveloper如果用Dapper实现事务功能,大概有三种实现方式。简单的事务方法这种 查看详情

一文快速搞懂mysqlinnodb事务acid实现原理(代码片段)

...做日志的结合体。这一篇主要讲一下InnoDB中的事务到底是如何实现ACID的:原子性(atomicity)一致性(consistency)隔离性(isolation)持久性(durability)隔离性隔离性的实现原理就是锁,因而隔离性也可以称为并发控制、锁等。事务 查看详情

第三十三课双向循环链表的实现(代码片段)

   头结点不位于链表里面,只是用于定位,和内核链表不同。  将LinuxList.h添加到我们的工程中。再添加一个DualCircleList.h文件:1#ifndefDUALCIRCLELIST_H2#defineDUALCIRCLELIST_H34#include"LinuxList.h"5#include"DualLinkList.h"67 查看详情

面试官:@transactional注解是如何实现的?(代码片段)

@Transactional注解简介@Transactional是spring中声明式事务管理的注解配置方式,相信这个注解的作用大家都很清楚。@Transactional注解可以帮助我们把事务开启、提交或者回滚的操作,通过aop的方式进行管理。通过@Tra... 查看详情

机器学习100天(三十三):033kd树的python实现(代码片段)

《机器学习100天》完整目录:目录机器学习100天,今天讲的是:KD树的Python实现!打开spyder,我们新建一个kd_tree.py脚本。首先,我们新建一个类,名为Node,它定义了KD树节点中包含的数据结构。例如数据、深度、左节点、右节点... 查看详情

ssm使用abstractroutingdatasource后究竟如何解决跨库事务(代码片段)

...切换数据库吗?Spring的事务是怎么开启的?  3.结合Mybatis如何实现动态切换的同时开启分布式事务?Myopinion:   Forquestion1:  我们用一个类来继承AbstractRoutingDataSource,只需实现一个方法,那就是  @OverrideprotectedObjectdetermineCurr... 查看详情

记账本开发记录——第十三天(2020.1.31)(代码片段)

今天主要是学习了如何使用servletcontext来进行一个记录网站登录人数的案例。在实现这个案例之前,首先要学习相关的知识。ServletContext:在服务器启动的时候,为每个web应用创建一个单独的ServletContext对象,我们可以使用这个对... 查看详情

akka学习教程(十三)akka分布式(代码片段)

...列文章目录akka学习教程(十四)akka分布式实战akka学习教程(十三)akka分布式akka学习教程(十二)Spring与Akka的集成akka学习教程(十一)akka持久化akka学习教程(十)agentakka学习教程(九)STM软件事务内存akka学习教程(八)Actor中的Future-询问模式akk... 查看详情