mysql 锁

Ysctest / 2023-05-05 / 原文

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。