翔云

Just try, don't shy. 最新文章请点击
随笔 - 294, 文章 - 0, 评论 - 27, 阅读 - 49万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

大事务big or long transaction模拟

Posted on   翔云123456  阅读(261)  评论(0编辑  收藏  举报

所谓大事务,是指执行过程比较长的事务。

例如,执行超过5s,10s,1min。。。。

一个事务可以有多个event,也可以只有一个event。

本文主要介绍如何模拟一个有多个event的大事务。

创建表

建表sql

CREATE TABLE `apple_test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `a` int(11) NOT NULL DEFAULT '0' COMMENT 'a',
  `b` int(11) NOT NULL DEFAULT '0' COMMENT 'b',
  `updated_ts` timestamp(6) NOT NULL DEFAULT '0000-00-00 00:00:00.000000' ON UPDATE CURRENT_TIMESTAMP(6),
  `created_ts` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入大量数据,模拟大事务

首先插入一条记录

> insert into apple_test(`a`, `b`) values(1,1);

接着反复执行如下SQL,插入大量数据记录

> insert into apple_test(a, b) select a,b from apple_test;

在反复执行的过程中,我们会发现,执行耗时越来越长。
这是因为每次插入的数据量越来越大。

例如,当我们多次执行,数量达到8388608时,

> select count(*) from apple_test;
+----------+
| count(*) |
+----------+
|  8388608 |
+----------+
1 row in set (1.87 sec)

再次执行插入时,耗时会是几十秒,甚至几分钟:

> insert into apple_test(a, b) select a,b from test_test;
Query OK, 8388608 rows affected (1 min 20.68 sec)
Records: 8388608  Duplicates: 0  Warnings: 0

实际上,上面的插入语句,就是一个事务。

执行过程耗时较长时,模拟的也就是大事务。

查看大事务


>select a.trx_started,now(),(UNIX_TIMESTAMP(now()) - UNIX_TIMESTAMP(a.trx_started)) diff_sec,b.id,b.user,b.host,b.db,d.SQL_TEXT from information_schema.innodb_trx a inner join information_schema.PROCESSLIST b on a.TRX_MYSQL_THREAD_ID=b.id and b.command in('Query', 'Sleep', 'Connect') inner join performance_schema.threads c ON b.id = c.PROCESSLIST_ID inner join performance_schema.events_statements_current d ON d.THREAD_ID = c.THREAD_ID;
+---------------------+---------------------+----------+--------+-------------+------+------+----------+
| trx_started         | now()               | diff_sec | id     | user        | host | db   | SQL_TEXT |
+---------------------+---------------------+----------+--------+-------------+------+------+----------+
| 2021-08-07 22:12:20 | 2021-08-07 22:13:26 |       66 | 808786 | system user |      | NULL | BEGIN    |
+---------------------+---------------------+----------+--------+-------------+------+------+----------+
1 row in set (0.01 sec)

参考

为什么要避免大事务以及大事务如何解决?

MySQL-长事务详解

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示