mysql 事务未提交_MySQL事务未提交导致整个表锁死

当MySQL事务未提交时,后续操作会因锁等待超时而失败。可以查询information_schema.innodb_trx等表找到未提交的事务,通过kill thread id终止事务。了解innodb_trx、innodb_locks、innodb_lock_waits表的字段含义有助于诊断和解决此类问题。
摘要由CSDN通过智能技术生成

问题及说明:

当一个SQL事务执行完了,但未COMMIT,后面的SQL想要执行就是被锁,超时结束;报错信息如下:

mysql> ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

处理步骤:

该问题发生环境为MySQL 5.6,在MySQL 5.5版本后,information_schema 库中增加了三个关于锁的表,分别如下:

innodb_trx:当前运行的所有事务

innodb_locks:当前出现的锁

innodb_lock_waits:锁等待的对应关系

该问题可以直接从这个几张表入手,找到了一直没有提交的只读事务,然后 kill thread id

,最后确认只读事物是否被干掉了就OK了。解决步骤如下:

mysql> select * from information_schema.innodb_trx;

mysql> SHOW FULL PROCESSLIST;

mysql> kill 'thread id';

mysql> select * from information_schema.innodb_trx;

PS:如需要查看定位是哪条语句,可以在MySQL的binlog日志中查看根据id和时间定位查找语句。

MySQL事务知识点延伸:

1. 三个库的字段含义

mysql > desc 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 | |#被锁的数据

+-------------+---------------------+------+-----+---------+-------+

10 rows in set (0.00 sec)

mysql> desc 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

+-------------------+-------------+------+-----+---------+-------+

4 rows in set (0.00 sec)

mysql> desc 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 | |#

+----------------------------+---------------------+------+-----+---------------------+-------+

22 rows in set (0.01 sec)

转自:

https://www.colabug.com/1912433.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值