1、表锁
- table_locks_immediate : 表立即获取表锁的次数
- table_locks_waited:等待获取表锁的次数(即不能立即获取表锁的次数)
例子
假如test_db 有四张表则下面的执行语句的上面的 table_locks_immediate 的值会加4
mysqldump -uroot -proot test_db --lock-tables --flush-logs > ../backup/test_db.sql
2、从information_schema库查询锁
- innodb_t
- innodb_locks
- innodb_lock_waits
transaction1: select * from obj_order where id = 3 for update;
transaction2: select * from obj_order where id = 3 for update;
SELECT trx_id,trx_state,trx_started,trx_requested_lock_id,trx_wait_started,trx_weight,trx_mysql_thread_id,trx_query FROM information_schema.INNODB_TRX;
elect * from information_schema.INNODB_LOCKS;
select * from information_schema.INNODB_LOCK_WAITS;
1) innodb_trx表结构说明 (摘取最能说明问题的8个字段)
字段名 | 说明 |
trx_id | innodb存储引擎内部唯一的事物ID |
trx_state | 当前事物状态(running和lock wait两种状态) |
trx_started | 事物的开始时间 |
trx_requested_lock_id | 等待事物的锁ID,如trx_state的状态为Lock wait,那么该值带表当前事物等待之前事物占用资源的ID,若trx_state不是Lock wait 则该值为NULL |
trx_wait_started | 事物等待的开始时间 |
trx_weight | 事物的权重,在innodb存储引擎中,当发生死锁需要回滚的时,innodb存储引擎会选择该值最小的进行回滚 |
trx_mysql_thread_id | mysql中的线程id, 即show processlist显示的结果 |
trx_query | 事物运行的SQL语句 |
trx_tables_locked | 是否是表锁。1:是,, 0:否 |
trx_isolation_level | 事务隔离级别。 |
2)innodb_locks表结构说明
字段名 | 说明 |
lock_id | 锁的ID |
lock_trx_id | 事物的ID |
lock_mode | 锁的模式(S锁与X锁两种模式) |
lock_type | 锁的类型 表锁还是行锁(RECORD) |
lock_table | 要加锁的表 |
lock_index | 锁住的索引 |
lock_space | 锁住对象的space id |
lock_page | 事物锁定页的数量,若是表锁则该值为NULL |
lock_rec | 事物锁定行的数量,若是表锁则该值为NULL |
lock_data | 事物锁定记录主键值,若是表锁则该值为NULL(此选项不可信) |
3)innodb_lock_waits表结构说明
字段名 | 说明 |
requesting_trx_id | 申请锁资源的事物ID |
requested_lock_id | 申请的锁的ID |
blocking_trx_id | 阻塞其他事物的事物ID |
blocking_lock_id | 阻塞其他锁的锁ID |
常见问题
1、Lock wait timeout exceeded; try restarting transaction
select * from information_schema.INNODB_TRX;
kill trx_mysql_thread_id; -- trx_mysql_thread_id 是查出来的值