首页 > 数据库 > MySQL > 正文

MySQL-长事务解说

2024-07-24 12:36:23
字体:
来源:转载
供稿:网友
  『入门MySQL』系列文章已经完结,今后我的文章还是会以MySQL为主,主要记录下近期工作及学习遇到的场景或者自己的感悟想法,可能后续的文章不是那么连贯,但还是希望大家多多支持。言归正传,本篇文章主要介绍MySQL长事务相关内容,比如说我们开启的一个事务,一直没提交或回滚会怎样呢,出现事务等待情况应该如何处理,本篇文章将给你答案。
 
  注意:本篇文章并不聚焦于谈论事务隔离级别以及相关特性。而是介绍长事务相关危害以及监控处理方法。本文是基于MySQL5.7.23版本,不可重复读(RR)隔离级别所做实验。
 
  1.什么是长事务
  首先我们先要知道什么是长事务,顾名思义就是运行时间比较长,长时间未提交的事务,也可以称之为大事务。这类事务往往会造成大量的阻塞和锁超时,容易造成主从延迟,要尽量避免使用长事务。
 
  下面我将演示下如何开启事务及模拟长事务:
 
  #假设我们有一张stu_tb表,结构及数据如下
  mysql> show create table stu_tb/G
  *************************** 1. row ***************************
         Table: stu_tb
  Create Table: CREATE TABLE `stu_tb` (
    `increment_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
    `stu_id` int(11) NOT NULL COMMENT '学号',
    `stu_name` varchar(20) DEFAULT NULL COMMENT '学生姓名',
    `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
    PRIMARY KEY (`increment_id`),
    UNIQUE KEY `uk_stu_id` (`stu_id`) USING BTREE
  ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COMMENT='测试学生表'
  1 row in set (0.01 sec)
 
  在结果中idle_time是计算产生的,也是事务的持续时间。但事务的trx_query是NUL,这并不是说事务什么也没执行,一个事务可能包含多个SQL,如果SQL执行完毕就不再显示了。当前事务正在执行,innodb也不知道这个事务后续还有没有sql,啥时候会commit。 因此trx_query不能提供有意义的信息。

(编辑:武林网)

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表