正在等待GET_LOCK() 。
Waiting for tables
该线程得到通知,数据表结构已经被修改了,需要重新打开数据表以取得新的结构 。然后,为了能的重新打开数据表,必须等到所有其他线程关闭这个表 。以下几种情况下会产生这个通知:FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE,或OPTIMIZE TABLE 。
Waiting for handler insert查看当前正在被锁的事务
INSERT DELAYED已经处理完了所有待处理的插入操作,正在等待新的请求 。
#查看当前正在被锁的事务(锁请求超时后则查不到)mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;+------------------+-------------+-----------+-----------+-------------+-----------------+------------+-----------+----------+----------------+| lock_id| lock_trx_id | lock_mode | lock_type | lock_table| lock_index| lock_space | lock_page | lock_rec | lock_data|+------------------+-------------+-----------+-----------+-------------+-----------------+------------+-----------+----------+----------------+| 130718495:65:3:4 | 130718495| X| RECORD| `test`.`bb` | GEN_CLUST_INDEX |65 |3 |4 | 0x000000000300 || 130718496:65:3:4 | 130718496| X| RECORD| `test`.`bb` | GEN_CLUST_INDEX |65 |3 |4 | 0x000000000300 |+------------------+-------------+-----------+-----------+-------------+-----------------+------------+-----------+----------+----------------+ 查看当前等待锁的事务#查看当前等待锁的事务(锁请求超时后则查不到)mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS; +-------------------+-------------------+-----------------+------------------+| requesting_trx_id | requested_lock_id | blocking_trx_id | blocking_lock_id |+-------------------+-------------------+-----------------+------------------+| 130718499| 130718499:65:3:4| 130718500| 130718500:65:3:4 |+-------------------+-------------------+-----------------+------------------+ 查看当前未提交的事务 #查看当前未提交的事务(如果死锁等待超时,事务可能还没有关闭)mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
文章插图
主要看箭头指向的这几个字段,如果有阻塞数据(不为0的就是阻塞的),找到后在根据下图这个字段:try_mysql_thread_id 作为这条数据的主键id执行这个sql进行删除: kill id ;(杀死对应id的进程).假设这里try_mysql_thread_id=14的这条数据是锁了 。我们执行 kill 14删除就不再锁表了 。
查看正在被访问的表
#查看正在被访问的表mysql> show OPEN TABLES where In_use > 0;+----------+-------+--------+-------------+| Database | Table | In_use | Name_locked |+----------+-------+--------+-------------+| test| bb|1 |0 |+----------+-------+--------+-------------+死锁异常#step 3:窗口一 (若第三步中锁请求太久,则出现锁超时而终止执行)mysql> update bb set name='bbb';ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction#"窗口一" 锁请求超时前,执行第五步,使死锁产生,则该连接 "窗口二" 执行终止,"窗口一" 顺利执行#step 5:窗口二mysql> update aa set name='aa';ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction查看最近一个死锁情况mysql> SHOW ENGINE INNODB STATUS;
文章插图
相关参数配置死锁日志
#死锁记录只记录最近一个死锁信息,若要将每个死锁信息都保存到错误日志,启用以下参数:mysql> show variables like 'innodb_print_all_deadlocks';+----------------------------+-------+| Variable_name| Value |+----------------------------+-------+| innodb_print_all_deadlocks | OFF|+----------------------------+-------+ 锁等待超时 #上面 【step 3:窗口一】若一直请求不到资源,默认50秒则出现锁等待超时 。mysql> show variables like 'innodb_lock_wait_timeout'; +--------------------------+-------+| Variable_name| Value |+--------------------------+-------+| innodb_lock_wait_timeout | 50|+--------------------------+-------+ ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction#设置全局变量 锁等待超时为60秒(新的连接生效)#mysql> set session innodb_lock_wait_timeout=50; mysql> set global innodb_lock_wait_timeout=60;事务回滚 #上面测试中,当事务中的某个语句超时只回滚该语句,事务的完整性属于被破坏了 。为了回滚这个事务,启用以下参数:mysql> show variables like 'innodb_rollback_on_timeout';+----------------------------+-------+| Variable_name| Value |+----------------------------+-------+| innodb_rollback_on_timeout | OFF|+----------------------------+-------+
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Mysql数据库安装与操作
- 重庆十大特产推荐
- 菊花茶产地最好在哪里,中国绿茶主要产地主要在哪里
- 产后瑜伽动作有吗
- 收藏多年的MySQL函数大全笔记,用到的时候翻一下,百度都省了
- MySQL监控工具PMM分享
- 婺源皇菊多少斤,金丝皇菊产地哪的
- JAVA应用生产问题排查步骤
- 原来一条select语句在MySQL是这样执行的
- 海南哪里产桔子,麦冬哪里产的最好
