MySQL:lock wait timeout exceeded; try restarting transactio解决方案
错误提示的意思,很明显,是因为这条语句被锁住了。所以释放这个锁
我们可以到information_schema中查询
解释:information_schema这张数据表保存了MySQL服务器所有数据库的信息。
如数据库名,数据库的表,表栏的数据类型与访问权限等。
再简单点,这台MySQL服务器上,到底有哪些数据库、各个数据库有哪些表,每张表的字段类型是什
么,各个数据库要什么权限才能访问,等等信息都保存在information_schema表里面。
我们可以用下面三张表来查原因:
innodb_trx 当前运行的所有事务
innodb_locks 当前出现的锁
innodb_lock_waits 锁等待的对应关系
- 查看数据库锁id
- 图中红色语句为占用系统资源的语句,我们需要杀掉这个锁,执行 kill 线程id号。上面这条记录的id为319618246
所以我们执行:kill 319618246即可
执行之后:
其他的记录不需要关注,因为其他的记录状态为“RUNNING” 即正在执行的事务,并没有锁
扩展:表结构
desc information_schema.innodb_locks;
Field | Type | Null | Key | Default | Remark |
---|---|---|---|---|---|
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 | 被锁的数据 |
desc information_schema.innodb_lock_waits
Field | Type | Null | Key | Default | Remark |
---|---|---|---|---|---|
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 |
desc information_schema.innodb_trx ;
Field | Type | Null | Default | Remark |
---|---|---|---|---|
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 | # |