Seata入门系列【10】分布式事务环境下数据库批量插入和批量更新操作

news2024/11/18 16:32:59

1 前言

批量插入和批量更新是常用的数据库操作,接下来我们分析下在seata 中如何使用。

如果使用循环遍历插入,效率是很慢的,所以一般的ORM框架都是支持批量操作的,接下来以Mybatis 为例,深入了解下如何使用批处理。

2 批量插入

2.1 Mybatis-plus

Mybatis 提供了批处理的相关API,Mybatis-plus对其进行了封装,Service 接口提供了saveBatch方法用于批量插入操作,源码如下:

    public boolean saveBatch(Collection<T> entityList, int batchSize) {
        String sqlStatement = this.sqlStatement(SqlMethod.INSERT_ONE);
        int size = entityList.size();
        this.executeBatch((sqlSession) -> {
            int i = 1;

            for(Iterator var6 = entityList.iterator(); var6.hasNext(); ++i) {
                T entity = var6.next();
                sqlSession.insert(sqlStatement, entity);
                if (i % batchSize == 0 || i == size) {
                    sqlSession.flushStatements();
                }
            }

        });
        return true;
    }

可以看到,saveBatch是循环添加每一条插入语句,然后进行批量提交,所以在使用的时候需要在JDBC连接中添加批处理参数rewriteBatchedStatements=true,这是因为:

MySQLJDBC连接的url中要加rewriteBatchedStatements参数,并保证5.1.13以上版本的驱动,才能实现高性能的批量插入。
MySQL JDBC驱动在默认情况下会无视executeBatch()语句,把我们期望批量执行的一组sql语句拆散,一条一条地发给MySQL数据库,批量插入实际上是单条插入,直接造成较低的性能。
只有把rewriteBatchedStatements参数置为true, 驱动才会帮你批量执行SQL
另外这个选项对INSERT/UPDATE/DELETE都有效

可以看到这里是循环插入:
在这里插入图片描述
所有插入语句执行后,会为每条插入记录生成全局锁,正常全局提交后,再删除相关日志和锁记录。
在这里插入图片描述

2.2 使用foreach标签

Mybatis 中可以使用foreach标签进行批量插入,效率比上面的方式更快,比如先写一个Mapper 接口:

public Integer insertBatch(List<OrderTbl> list);

再使用foreach标签执行批量插入:

    <insert id="insertBatch" parameterType="java.util.List">
        INSERT INTO order_tbl ( id, user_id, commodity_code, count ) VALUES
        <foreach collection="list" item="orderTbl" index="index" separator=",">
            (
            NULL, #{orderTbl.userId},
            #{orderTbl.commodityCode},
            #{orderTbl.count}
            )
        </foreach>
    </insert>

执行时的SQL 如下图:
在这里插入图片描述
SQL 执行以后,Seata 会为这些所有的插入数据生成全局锁:
在这里插入图片描述
在回滚日志中,也记载了所有数据:
在这里插入图片描述
当无异常时,全局提交,删除相关日志记录。
在这里插入图片描述
异常时,根据回滚日志查询到所有插入的记录,再依次删除。
在这里插入图片描述

3 批量更新

Seata 也是支持Mysql 批量更新的,批量更新的方式也有很多种,这里以Mybatis-plus 提供的方法为例。

updateBatchById 其和批量插入一样,也是循环所有更新语句,然后批量提交:

    public boolean updateBatchById(Collection<T> entityList, int batchSize) {
        Assert.notEmpty(entityList, "error: entityList must not be empty", new Object[0]);
        String sqlStatement = this.sqlStatement(SqlMethod.UPDATE_BY_ID);
        int size = entityList.size();
        this.executeBatch((sqlSession) -> {
            int i = 1;

            for(Iterator var6 = entityList.iterator(); var6.hasNext(); ++i) {
                T anEntityList = var6.next();
                ParamMap<T> param = new ParamMap();
                param.put("et", anEntityList);
                sqlSession.update(sqlStatement, param);
                if (i % batchSize == 0 || i == size) {
                    sqlSession.flushStatements();
                }
            }

        });
        return true;
    }

执行SQL 时,可以看到依然是循环:
在这里插入图片描述
执行完成后,依旧是查询前后镜像,生成回滚日志。
在这里插入图片描述
最终进行全局提交或者回滚。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1109885.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c语言练习94:分割链表

分割链表 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你不需要 保留 每个分区中各节点的初始相对位置。 示例 1&#xff1a; 输入&#xff1a;head [1,4,3,2,5,2], x…

python小游戏:打砖块完整代码

代码如下 import pygame import sys# 初始化Pygame pygame.init()# 游戏窗口尺寸 WIDTH, HEIGHT 800, 600# 颜色定义 WHITE (255, 255, 255) BLUE (0, 0, 255) GREEN (0, 255, 0)# 创建游戏窗口 win pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_captio…

2023年高校大数据实验室建设及大数据实训平台整体解决方案

大数据实验室作为支撑高校人培方案实施的核心设施&#xff0c;大数据实训实验室的建设一定要与学科建设、人才培养充分融合&#xff0c;是一个包含物理空间硬件资源软件资源课程内容的系统化工程。高校大数据实验室建设&#xff0c;除了考虑物理空间与硬件资源外&#xff0c;重…

实验室超声波清洗机的作用

实验室超声波清洗机的作用是什么&#xff1f;顾名思义&#xff0c;其主要作用是清洗。超声波清洗机是实验室中必不可少的清洗装置&#xff0c;利用超声波在液体中的空化效应&#xff0c;产生空化气泡&#xff0c;由于正负压的作用下&#xff0c;空化气泡会在短时间内生成并爆破…

移动协同办公系统,让工作更轻松,生活更美好!

在今天这个信息化、数字化的时代&#xff0c;人们对于工作效率的需求越来越高。随着移动互联网的普及&#xff0c;越来越多的人开始将工作与生活的界限模糊化。在这个背景下&#xff0c;移动协同办公系统应运而生&#xff0c;它打破了传统办公模式的束缚&#xff0c;让工作更轻…

通讯协议学习之路:QSPI协议理论

通讯协议之路主要分为两部分&#xff0c;第一部分从理论上面讲解各类协议的通讯原理以及通讯格式&#xff0c;第二部分从具体运用上讲解各类通讯协议的具体应用方法。 后续文章会同时发表在个人博客(jason1016.club)、CSDN&#xff1b;视频会发布在bilibili(UID:399951374) 一、…

【动态规划】392. 判断子序列、115. 不同的子序列

提示&#xff1a;努力生活&#xff0c;开心、快乐的一天 文章目录 392. 判断子序列&#x1f4a1;解题思路&#x1f914;遇到的问题&#x1f4bb;代码实现&#x1f3af;题目总结 115. 不同的子序列&#x1f4a1;解题思路&#x1f914;遇到的问题&#x1f4bb;代码实现&#x1f3…

进程地址空间初识

进程地址空间&#xff1a; 空间布局图&#xff1a; 下面来看这样一段代码&#xff1a; 对应执行的结果如下&#xff1a; 可以看到一个很奇怪的现象&#xff1a; g_val的值不同&#xff0c;却用的是同一块地址 这是为什么&#xff1f; 说明对应的地址一定不是物理地址&#…

EF执行迁移时提示provider: SSL Provider, error: 0 - 证书链是由不受信任的颁发机构颁发的

ef在执行时提示provider: SSL Provider, error: 0 - 证书链是由不受信任的颁发机构颁发的。 只需要在数据库链接字符串后增加EncryptTrue;TrustServerCertificateTrue;即可 再次执行

c++生成随机数(猜数字游戏)

如果之前学过python的小伙伴看到随机数这个知识点肯定会觉得很简单&#xff0c;但是c的随机数就需要注意一些小细节了~ 先来给大家展示一下python的随机数&#xff1a; import random #导入随机数库 arandom.randint(100,200)#随机100-200之间的数字 以下是c的&a…

【黑夜送书第一期】好书来袭,AI时代程序员/项目经理开发之道送3本~

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…

Elasticsearch:生成式人工智能带来的社会转变

作者&#xff1a;JEFF VESTAL 了解 Elastic 如何走在大型语言模型革命的最前沿 – 通过提供实时信息并将 LLM 集成到数据分析的搜索、可观察性和安全系统中&#xff0c;帮助用户将 LLM 提升到新的高度。 iPhone 社会转变&#xff1a;新时代的黎明 曾几何时&#xff0c;不久前…

毫米波雷达2-雷达的工作模式

文章目录 flash mode: 用于烧写functional mode: Power off the board and remove the jumper from only header SOP2 (this puts the board back in functional mode) flash mode: 用于烧写 functional mode: Power off the board and remove the jumper from only header SOP…

配电房环境智能监控系统:守护电力设施,保障安全运行

随着电力系统的日益复杂化&#xff0c;配电房的环境监控显得尤为重要。传统的监控方式已经无法满足现代配电房的需求&#xff0c;因此&#xff0c;配电房环境智能监控系统应运而生。 一、系统概述 力安科技电易云配电房环境智能监控系统是一款集成了环境参数监测、设备运行…

当AI遇上3D建模:一场创意与技术的完美碰撞!

在这个充满无限可能的时代&#xff0c;科技的发展日新月异&#xff0c;让我们见证了一场创意与技术的完美碰撞——AI与3D建模的结合。这种结合为我们开辟了一个全新的领域&#xff0c;让我们在虚拟世界中自由挥洒创意&#xff0c;为现实世界创造更多的可能性。 3D建模AI生成是…

Windows下定时下载Linux服务器的数据库备份文件(pscp+bat脚本+定时任务)

下载传输软件pscp Download PuTTY: latest release (0.79) 创建bat执行脚本 echo 删除旧的备份文件 del D:\db_bk\*.dbecho 下载新的备份文件 D:\Programs\pscp -P 22 -pw youPassword youName192.168.1.1:/home/backup/test.db D:\db_bk\ 设置定时任务 1.使用任务计划程…

2023年【天津市安全员C证】报名考试及天津市安全员C证操作证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 天津市安全员C证报名考试是安全生产模拟考试一点通生成的&#xff0c;天津市安全员C证证模拟考试题库是根据天津市安全员C证最新版教材汇编出天津市安全员C证仿真模拟考试。2023年【天津市安全员C证】报名考试及天津市…

代码与细节(一)

在用到 Java17的新特性 Unmodifiable Lists 时不知道你是否和我有同样的惊讶 为什么弄了这么多重载方法&#xff1f; 先说结论&#xff1a;为了性能。 其实一细想&#xff0c;都能想明白&#xff1a;varargs(可变参数) 的背后是数组的内存分配和初始化&#xff0c;相比正常的…

36张图详解网络基础知识

下午好&#xff0c;我的网工朋友。 在网工这行&#xff0c;只要是面试&#xff0c;一般都难逃网络协议相关的问题吧。 不管是OSI还是TCP/IP&#xff0c;这都是非常重要、基础的知识&#xff0c;很多知识点都是以它们为基础去串联的。 作为网络世界的底层技术&#xff0c;掌握…

外贸行业常用英文邮件模板分享

外贸邮件营销可以帮助企业扩大客户群、提高客户忠诚度、降低营销成本、提高营销效果、增强客户沟通和提高客户满意度等方面具有重要作用和优势&#xff0c;U-Mail邮件营销平台给大家分享一些外贸企业常用的英文邮件模板 以下是一些英文邮件模板案例&#xff0c;供您参考&#x…