一、表锁产生
1.设置当前会话不自动提交事务
SELECT @@autocommit;
SET @@autocommit =0;
2.模拟test表级锁事务产生
# 模拟表级锁事务产生
BEGIN;
LOCK TABLES test WRITE;
二、线上环境如何处理
1. 新开一个会话并查询id
SELECT CONNECTION_ID();
2. 查看等待锁的会话和持有锁的会话id
SELECT * FROM sys.schema_table_lock_waits;
3. 查询持有锁的会话在哪里执行的
SELECT * FROM information_schema.processlist WHERE Id = '18';
4. 杀死会话
KILL 18
三、产生的原因总结
在正式环境中要在用户使用频率不高时执行DML、修改索引等操作,出现表锁只能手动kill掉,目前也没有其他很好解决方式。
注意 innodb_lock_wait_timeout 的设置仅对innodb行级锁有效, 表级锁无效!
SET GLOBAL innodb_lock_wait_timeout = 20;
SET SESSION innodb_lock_wait_timeout = 10;