美文网首页
MySQL 事务没有提交导致 锁等待 Lock wait tim

MySQL 事务没有提交导致 锁等待 Lock wait tim

作者: 随心热爱 | 来源:发表于2017-09-20 13:44 被阅读0次

错误示例:Lock wait timeout exceeded; try restarting transaction(SQL: update table set field= field + 1 where id = 111)......

出现此问题的原因:当一个SQL执行完了,但未COMMIT,后面的SQL想要执行就是被锁,超时结束;

解决方案:

找到原始的锁ID,然后KILL掉一直持有的那个线程就可以了;

but光从数据库无法着手找出源头是哪个SQL锁住了;

有时候看看show engine innodb status , 并结合 show full processlist;能暂时解决问题;但一直不能精确定位;

在5.5中,information_schema库中增加了三个关于锁的表(MEMORY引擎);

innodb_trx ## 当前运行的所有事务

innodb_locks ## 当前出现的锁

innodb_lock_waits ## 锁等待的对应关系

下面来看一下这三个关于锁的表字段信息:

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)


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)


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)

根据 select * from information_schema.innodb_trx 你可以获取被锁的事务进程信息

被锁的事务信息

有图可看出,线程 7261707 忘掉 COMMIT 了,然后我们执行 kill 7261707 将其杀死即可。

相关文章

网友评论

      本文标题:MySQL 事务没有提交导致 锁等待 Lock wait tim

      本文链接:https://www.haomeiwen.com/subject/lhqosxtx.html