什么是大事务?以及大事务产生的问题

简介: 什么是大事务?以及大事务产生的问题

什么是大事务?以及大事务产生的问题

一、定义

运行时间比较长,操作的数据比较多的事务我们称之为大事务。

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

二、大事务风险

  • 锁定太多的数据,造成大量的阻塞和锁超时,回滚所需要的时间比较长。
  • 执行时间长,容易造成主从延迟。
  • undo log膨胀

三、避免大事务

  • 避免一次处理太多大数据。
  • 移出不必要在事务中的select操作

我这里按公司实际场景,规定了,每次操作/获取数据量应该少于5000条,结果集应该小于2M

四、案例

创建表

建表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)

五、大表带来的问题

  • 大表定义:单表超过千万行、文件超过10G
  • 大表对查询的影响:
  • 慢查询、
  • 区分度底、
  • 大量磁盘IO、
  • 建立索引需要很长的时间、
  • 修改表结构需要长时间锁表、
  • 影响正常的数据操作
  • 如何处理大表问题:
  • 分库分表把一张表分成多个小表。难点:分表主键的选择、分表后夸分区数据的查询和统计。
  • 大表的历史数据归档(前端增加历史查询)难点:时间点选择,如何进行归档操作

六、在大促中数据库服务器

  • 数据库架构:主从复制、读写分离、集群等。
  • TPS:每秒处理事务的速度(一个事务三个过程)。
  • 用户请求服务器
  • 服务器内部处理
  • 服务器返回给用户。
  • QPS:是一台指定服务器每秒能够相应的查询次数。
  • 并发量:同一时间处理的请求的数量。
  • 连接数:和服务器进行连接,但大部分处于sleep状态,只有少部分在运行。
  • 并发量大,连接数大说明cpu空闲少繁忙。
  • 磁盘IO读写过高会对服务器性能能造成影响。
  • 不要在主库上数据库备份(磁盘读压力增大)。

相关文章
|
6天前
|
SQL 关系型数据库 MySQL
事务及事务的隔离级别
事务及事务的隔离级别
|
6天前
事务
事务 事务的基本介绍 1.概念: 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败 操作 1.开启事务:start transaction 2.回滚:rollback 3.提交:commit 自动提交和手动提交
26 0
|
6天前
|
数据库
事务
事务 事务的基本介绍 1.概念: 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败 操作 1.开启事务:start transaction 2.回滚:rollback 3.提交:commit 自动提交和手动提交 查询事务默认提交方式 1=自动,0=手动 SELECT @@autocommit 修改默认提交 set@@autocommit =xx 事务的四大特征 1.原子性:是不可分割的最小操作单位,要么同时成功,要么失败 2.持久性:当事务提交或回滚后,数据库会持久化的保存数据 3.隔离性:多个事务之间。相互独立 4.一致性:事务操作前后,数据总量不变
26 4
|
6天前
事务
事务 事务的基本介绍 1.概念: 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败 操作 1.开启事务:start transaction 2.回滚:rollback 3.提交:commit 自动提交和手动提交
36 0
|
6天前
|
存储 Java 中间件
事务一致性测试
事务一致性测试
10 0
|
9月前
|
人工智能 关系型数据库 MySQL
事务详解
事务是逻辑上的一组操作,要么都执行,要么都不执行。
46 0
|
12月前
|
数据库
什么时候需要使用事务
什么时候需要使用事务
358 0
|
存储 Oracle 固态存储
深入理解事务
事务将应用程序的多个读、写操作捆绑在一起成为一个逻辑执行单元。即事务中的所有读写是一个执行的整体,整 个事务要么成功(提交)、要么失败(中止 或者 回滚)。如果失败,应用程序可以安全地重试。
16391 0
深入理解事务
|
SQL Java 大数据
事务详解(2)
你好看官,里面请!今天笔者讲的是事务。不懂或者觉得我写的有问题可以在评论区留言,我看到会及时回复。 注意:本文仅用于学习参考,不可用于商业用途,如需转载请跟我联系。
152 1
|
Oracle 安全 Java
事务详解(1)
你好看官,里面请!今天笔者讲的是事务。不懂或者觉得我写的有问题可以在评论区留言,我看到会及时回复。 注意:本文仅用于学习参考,不可用于商业用途,如需转载请跟我联系。
85 2