mysql 锁
1:查看数据库当前的进程,这个命令可以列出当前库所有的线程
mysql> show processlist;
2:查看当前的事物情况
2-1:查询当前数据库运行的所有事物
mysql> SELECT * FROM information_schema.INNODB_TRX;
2-2:查询当前数据库出现的锁
mysql> SELECT * FROM information_schema.INNODB_LOCKs;
2-3:查询锁等待的对应关系
mysql> SELECT * FROM information_schema.INNODB_LOCK_waits;
3:连表查询出所有需要杀掉的进程
mysql> select concat('KILL ',id,';') from information_schema.processlist p inner
join information_schema.INNODB_TRX x on p.id=x.trx_mysql_thread_id where db='test';
注:kill掉对应的进程之后,再次查询事物表。为空就可以正常执行了。
表锁
LOCK TABLES a WRITE;
INSERT INTO a_copy SELECT * FROM a WHERE create_time < DATE_SUB(NOW(), INTERVAL 3 MONTH);
UNLOCK TABLES;
行锁
BEGIN;
SELECT * FROM a WHERE create_time < DATE_SUB(NOW(), INTERVAL 3 MONTH) FOR UPDATE;
INSERT INTO a_copy SELECT * FROM a WHERE create_time < DATE_SUB(NOW(), INTERVAL 3 MONTH);
COMMIT;
查看当前正在被锁定的行:
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
# 8版本mysql
SELECT * FROM performance_schema.data_locks;
# 这条语句将会显示当前正在被锁定的行的相关信息,包括锁定的会话ID、锁定的表名、锁定的行号等。
查看当前等待锁定的行:
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
# 8版本mysql
SELECT * FROM performance_schema.data_lock_waits;
# 这条语句将会显示当前正在等待锁定的行的相关信息,包括等待的会话ID、等待的表名、等待的行号等。
查看表状态
SHOW OPEN TABLES;
如果某个表正在被锁定,则其状态为Locked。
查看表锁等待
SHOW FULL PROCESSLIST;
如果某个进程正在等待某个表的锁,则其状态为Waiting for table level lock。