MySQL - 锁等待超时与information_schema的三个表
引用地址:https://blog.csdn.net/J080624/article/details/80596958
回顾一下生产中的一次MySQL异常,Cause: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction解决与处理。
【1】抛个异常
异常如下:
Cause: java.sql.SQLException: Lock wait timeout exceeded;
try restarting transaction
1
2
翻译:锁等待超时,尝试重启事务。
【2】information_schema的三个表
information_schema.innodb_trx–当前运行的所有事务,
information_schema.innodb_locks–当前出现的锁
information_schema.innodb_lock_waits–锁等待的对应关系
① information_schema.innodb_trx–当前运行的所有事务
Field Type Null Key Default Extra
trx_id varchar(18) NO 事务ID
trx_state varchar(13) NO 事务状态:
trx_started datetime NO 0000-00-00 00:00:00 事务开始时间;
trx_requested_lock_id varchar(81) YES NULL innodb_locks.lock_id
trx_wait_started datetime YES NULL 事务开始等待的时间
trx_weight bigint(21) unsigned NO 0 事务权重
trx_mysql_thread_id bigint(21) unsigned NO 0 事务线程ID
trx_query varchar(1024) YES NULL 具体SQL语句
trx_operation_state varchar(64) YES NULL 事务当前操作状态
trx_tables_in_use bigint(21) unsigned NO 0 事务中有多少个表被使用
trx_tables_locked bigint(21) unsigned NO 0 事务拥有多少个锁
trx_lock_structs bigint(21) unsigned NO 0
trx_lock_memory_bytes bigint(21) unsigned NO 0 事务锁住的内存大小(B)
trx_rows_locked bigint(21) unsigned NO 0 事务锁住的行数
trx_rows_modified bigint(21) unsigned NO 0 事务更改的行数
trx_concurrency_tickets bigint(21) unsigned NO 0 事务并发票数
trx_isolation_level varchar(16) NO 事务隔离级别
trx_unique_checks int(1) NO 0 是否唯一性检查
trx_foreign_key_checks int(1) NO 0 是否外键检查
trx_last_foreign_key_error varchar(256) YES NULL 最后的外键错误
trx_adaptive_hash_latched int(1) NO 0
trx_adaptive_hash_timeout bigint(21) unsigned NO 0
② information_schema.innodb_locks–当前出现的锁
Field Type Null Key Default Extra
lock_id varchar(81) NO 锁ID
lock_trx_id varchar(18) NO 拥有锁的事务ID
lock_mode varchar(32) NO 锁模式
lock_type varchar(32) NO 锁类型
lock_table varchar(1024) NO 被锁的表
lock_index varchar(1024) YES NULL 被锁的索引
lock_space bigint(21) unsigned YES NULL 被锁的表空间号
lock_page bigint(21) unsigned YES NULL 被锁的页号
lock_rec bigint(21) unsigned YES NULL 被锁的记录号
lock_data varchar(8192) YES NULL 被锁的数据
③ information_schema.innodb_lock_waits–锁等待的对应关系
Field Type Null Key Default Extra
requesting_trx_id varchar(18) NO 请求锁的事务ID
requested_lock_id varchar(81) NO 请求锁的锁ID
blocking_trx_id varchar(18) NO 当前拥有锁的事务ID
blocking_lock_id varchar(81) NO 当前拥有锁的锁ID
开始测试
第一步:创建测试表tx1,并插入测试数据;
create table tx1
(id int primary key ,
c1 varchar(20),
c2 varchar(30)),
c3 datetime
engine=innodb default charset = utf8 ;
insert into tx1 values
(1,'aaaa','aaaaa2',SYSDATE()),
(2,'bbbb','bbbbb2',,SYSDATE()),
(3,'cccc','ccccc2',,SYSDATE());
1
2
3
4
5
6
7
8
9
10
11
第二步:手动开启事务,查询三个表数据
start transaction;
update tx1 set c1='heyf',c2='heyf',c3=SYSDATE() where id =3 ;
select * from information_schema.innodb_trx;
select * from information_schema.INNODB_LOCKS;
select * from information_schema.INNODB_LOCK_WAITS;
1
2
3
4
5
6
7
8
此时没有锁,锁等待关系,只有innodb_trx表中有数据
*************************** 1. row ***************************
trx_id: 75E34
trx_state: RUNNING
trx_started: 2018-06-06 16:55:37
trx_requested_lock_id: NULL
trx_wait_started: NULL
trx_weight: 3
trx_mysql_thread_id: 235
trx_query: NULL
trx_operation_state: NULL
trx_tables_in_use: 0
trx_tables_locked: 0
trx_lock_structs: 2
trx_lock_memory_bytes: 376
trx_rows_locked: 1
trx_rows_modified: 1
trx_concurrency_tickets: 0
trx_isolation_level: REPEATABLE READ
trx_unique_checks: 1
trx_foreign_key_checks: 1
trx_last_foreign_key_error: NULL
trx_adaptive_hash_latched: 0
trx_adaptive_hash_timeout: 10000
1 row in set (1.02 sec)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
第三步:在另一会话中更新该记录,产生锁等待;
start transaction;
update tx1 set c1='heyfffff',c2='heyffffff',c3=SYSDATE()
where id =3 ;
1
2
3
查看innodb_trx表数据:
mysql> select * from information_schema.innodb_trx\G;
*************************** 1. row ***************************
trx_id: 75E35
trx_state: LOCK WAIT##事务状态
trx_started: 2018-06-06 17:02:33
trx_requested_lock_id: 75E35:0:7509:5
trx_wait_started: 2018-06-06 17:02:33
trx_weight: 2
trx_mysql_thread_id: 238
trx_query: update tx1 set c1='heyfffff',c2='heyffffff',c3=SYSDATE() where id =3
trx_operation_state: starting index read
trx_tables_in_use: 1
trx_tables_locked: 1
trx_lock_structs: 2
trx_lock_memory_bytes: 376
trx_rows_locked: 1
trx_rows_modified: 0
trx_concurrency_tickets: 0
trx_isolation_level: REPEATABLE READ
trx_unique_checks: 1
trx_foreign_key_checks: 1
trx_last_foreign_key_error: NULL
trx_adaptive_hash_latched: 0
trx_adaptive_hash_timeout: 10000
*************************** 2. row ***************************
trx_id: 75E34
trx_state: RUNNING##事务状态
trx_started: 2018-06-06 16:55:37
trx_requested_lock_id: NULL
trx_wait_started: NULL
trx_weight: 3
trx_mysql_thread_id: 235
trx_query: NULL
trx_operation_state: NULL
trx_tables_in_use: 0
trx_tables_locked: 0
trx_lock_structs: 2
trx_lock_memory_bytes: 376
trx_rows_locked: 1
trx_rows_modified: 1
trx_concurrency_tickets: 0
trx_isolation_level: REPEATABLE READ
trx_unique_checks: 1
trx_foreign_key_checks: 1
trx_last_foreign_key_error: NULL
trx_adaptive_hash_latched: 0
trx_adaptive_hash_timeout: 10000
2 rows in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
查看INNODB_LOCKS表数据:
mysql> select * from information_schema.INNODB_LOCKS\G;
*************************** 1. row ***************************
lock_id: 75E35:0:7509:5
lock_trx_id: 75E35
lock_mode: X
lock_type: RECORD
lock_table: `test`.`tx1`
lock_index: `PRIMARY`
lock_space: 0
lock_page: 7509
lock_rec: 5
lock_data: 3
*************************** 2. row ***************************
lock_id: 75E34:0:7509:5
lock_trx_id: 75E34
lock_mode: X
lock_type: RECORD
lock_table: `test`.`tx1`
lock_index: `PRIMARY`
lock_space: 0
lock_page: 7509
lock_rec: 5
lock_data: 3
2 rows in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
查看INNODB_LOCK_WAITS表数据:
mysql> select * from information_schema.INNODB_LOCK_WAITS;\G
*************************** 1. row ***************************
requesting_trx_id: 75E35 ## 请求锁的事务
requested_lock_id: 75E35:0:7509:5 ## 请求锁的锁ID
blocking_trx_id: 75E34 ## 拥有锁的事务
blocking_lock_id: 75E34:0:7509:5 ## 拥有锁的锁ID
1
2
3
4
5
6
在执行第二个update的时候,由于第一个update事务还未提交,故而第二个update在等待,其事务状态为LOCK WAIT ,等待时间超过innodb_lock_wait_timeout值时,则会报ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction异常。
在第二个update锁等待超时之后,对第一个update手动提交事务,则第一个update语句成功更新数据库中数据表。
锁等待递进
如果是多个锁等待,比如有三个update,update同一行记录,则锁等待关系会层级递进,第二个第三个update都保留对第一个update的锁等待且第三个update保留对第二个update的锁等待,如下图:
【3】解决办法
① 查看并修改变量值
show GLOBAL VARIABLES like '%innodb_lock_wait_timeout%';
set GLOBAL innodb_lock_wait_timeout=100;##设置大小值看系统情况
1
2
3
innodb_lock_wait_timeout指的是事务等待获取资源等待的最长时间,超过这个时间还未分配到资源则会返回应用失败。参数的时间单位是秒,默认值50S。
② 找到一直未提交事务导致后来进程死锁等待的进程,并杀掉
根据锁等待表中的拥有锁的事务id(blocking_trx_id),从innodb_trx表中找到trx_mysql_thread_id值,kill掉。
如 这里杀掉 进程235:
select trx_mysql_thread_id from information_schema.innodb_trx it
JOIN information_schema.INNODB_LOCK_WAITS ilw
on ilw.blocking_trx_id = it.trx_id;
##trx_mysql_thread_id: 235
kill 235
③ 优化SQL,优化数据库,优化项目。第一个update未执行完,第二个update就来了,超过等待时间就会报锁等待超时异常。在数据并发项目遇到这种情况概率比较大,这时候就要从项目、数据库、执行SQL多方面入手了。
————————————————
版权声明:本文为CSDN博主「流烟默」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/J080624/article/details/80596958
MySQL - 锁等待超时与information_schema的三个表的更多相关文章
- MySQL锁等待分析【2】
MySQL锁等待分析[1]中对锁等待的分析是一步一步来的.虽然最后是分析出来了,可是用时是比较长的:理清各个表之间的关系后,得到如下SQL语句,方便以后使用 select block_trx.trx_ ...
- MySQL锁等待分析【1】
场景: 昨天业务系统上遇到了数据库慢的问题(对dcsdba.og_file_audit表的insert 慢&超时).分析后定位到是由于锁等待造成的.分析过程如下: 1.执行show proce ...
- MySQL锁等待与死锁问题分析
前言: 在 MySQL 运维过程中,锁等待和死锁问题是令各位 DBA 及开发同学非常头痛的事.出现此类问题会造成业务回滚.卡顿等故障,特别是业务繁忙的系统,出现死锁问题后影响会更严重.本篇文章我们一起 ...
- 查询MySQL锁等待的语句
select 'Blocker' role, p.id, p.user, left(p.host, locate(':', p.host) - 1) host, tx.trx_ ...
- RDS MySQL InnoDB 锁等待和锁等待超时的处理
https://help.aliyun.com/knowledge_detail/41705.html 1. Innodb 引擎表行锁等待和等待超时发生的场景 2.Innodb 引擎行锁等待情况的处理 ...
- MySQL事务锁等待超时 Lock wait timeout exceeded; try restarting transaction
工作中处理定时任务分发消息时出现的问题,在查找并解决问题的时候,将相关的问题博客收集整理,在此记录下,以便之后再遇到相同的问题,方便查阅. 问题场景 问题出现的场景: 在消息队列处理消息时,同一事务内 ...
- Mysql 锁机制和事务
InnoDB 锁机制 InnoDB存储引擎支持行级锁 其大类可以细分为共享锁和排它锁两类 共享锁(S):允许拥有共享锁的事务读取该行数据.当一个事务拥有一行的共享锁时,另外的事务可以在同一行数据也获得 ...
- MySQL锁之一:锁详解
一. 什么是死锁 死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等的进 ...
- Mysql错误: ERROR 1205: Lock wait timeout exceeded解决办法(MySQL锁表、事物锁表的处理方法)
Java执行一个SQL查询未提交,遇到1205错误. java.lang.Exception: ### Error updating database. Cause: java.sql.SQLExc ...
随机推荐
- Python的一些列表方法
1.append:方法append用于将一个对象附加到列表末尾,直接修改列表 lst=[1,2,3,4] lst.append(5) print(lst) 1,2,3,4,5 2.clear:方法cl ...
- android sdk 下载 最新版。。4.l
android sdk 下载 如今时间 2014.0709.,,这是最新的 64 位 windows 的 .为不能翻墙的小伙伴们准本
- kibana 7.* 设置中文 汉化
原文:kibana 7.* 设置中文 汉化 个人博客:forever121.cn kibana 一直是 日志分析 中得力的助手 由于 kibana5.* 6.* 官方并没有支持中文,需要另外下载补丁包 ...
- LNMP之PHP
PHP LNMP环境下的PHP安装 CGI指的是通用网关接口,为HTTP服务器与其他机器上的程序服务通信交流的一种工具,性能差,所以被淘汰了. FastCGI,是一个可以伸缩.高速的在HTTP服务器和 ...
- selenium 自动下载文件
#coding=utf-8 from selenium import webdriver #实例化一个火狐配置文件 fp = webdriver.FirefoxProfile() #设置各项参数,参数 ...
- 明年将制定个人信息保护法 网站部署https迫在眉睫
12月20日,全国人大常委会法工委举行第三次记者会.全国人大常委会法工委发言人岳仲明表示,中国明年将制定个人信息保护法.数据安全法等. 数据泄露为何频频出现 你是否经常接到骚扰电话?推销.诈骗等等均有 ...
- Jvm之class文件的加载、初始化
编写的java文件在要真正运行时,会首先被编译成 “.class"结尾的二进制文件,然后被虚拟机加载.那么在虚拟机中一个class文件要成为java实例,需要经历好几个步骤: 一.class ...
- 【Problem】xampp in ubuntu下命令行启动mysql报错: ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/opt/lampp/var/mysql/mysql.sock' (2)
xampp in ubuntu下命令行启动mysql报错: reddevil@reddevil-Lenovo:/opt/lampp$ ./bin/mysql -u root -p Enter pass ...
- 6361. 【NOIP2019模拟2019.9.18】鲳数
题目 题目大意 给你一个区间\([l,r]\),求这个区间内每个整数的十进制上从高位到低位的逆序对个数之和. 思考历程 一开始就知道这是个数位DP-- 结果一直都没有调出来,心态崩了-- 正解 先讲讲 ...
- rasa学习(domain.yml、nlu.md、stories.md)(一)
一. 什么是rasa Rasa是一个用于自动文本和基于语音的对话的开源机器学习框架.了解消息,保持对话以及连接到消息传递通道和API Rasa分为Rasa core和 Rasa nlu两部分: Ras ...