zoukankan      html  css  js  c++  java
  • 大事务big or long transaction模拟

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

    例如,执行超过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-长事务详解

    Just try, don't shy.
  • 相关阅读:
    【leetcode】7. 反转整数
    【leetcode】496. 下一个更大元素 I
    【leetcode】389. 找不同
    Linux驱动模型解析bus之platform bus
    shell 和进程
    递归调用在循环体内: 把循环展开, 这种情况是先循环再递归
    javascript函数柯里化以及柯里化带来的好处
    Maven测试篇
    关于ECharts Java类库的一个jquery插件
    javascript原型链继承
  • 原文地址:https://www.cnblogs.com/lanyangsh/p/15113517.html
Copyright © 2011-2022 走看看