MySQL中的锁表是指在数据库操作过程中,为了保证数据的一致性和完整性,对某些表或行进行加锁的操作。锁表可以分为共享锁(读锁)和排他锁(写锁)。共享锁允许多个事务同时读取同一数据,而排他锁则只允许一个事务进行读取或修改操作。
要查看MySQL中的锁表情况,可以使用以下SQL语句:
SHOW ENGINE INNODB STATUS;
执行上述语句后,可以在输出结果中找到“TRANSACTIONS”部分,其中包含了当前锁表的相关信息。例如:
------------------------
LATEST DETECTED FAILURE
------------------------
...
TRANSACTIONS
------------
Trx id counter 12345678
Purge done for trx's n:o < 12345677 undo n:o < 0 state: running but idle
History list length 10
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 0, not started, process no 1234, OS thread id 1234567890
MySQL thread id 1, query id 1 localhost root
show engine innodb status
---TRANSACTION 12345678, ACTIVE 0 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), heap size 376, 1 row lock(s)
MySQL thread id 2, query id 2 localhost root Sending data
select * from table_name where id = 1 for update
------- TRX HAS BEEN WAITING 0 SEC FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 123 page no 4 n bits 72 index `PRIMARY` of table `database_name`.`table_name` trx id 12345678 lock_mode X waiting
Record lock, heap no 1 PHYSICAL RECORD: n_fields 5; compact format; info bits 0
...
在上述输出结果中,可以看到当前有一个事务(trx id 12345678)正在等待获取锁。
SHOW ENGINE INNODB STATUS; -- 查看死锁信息
KILL QUERY <thread_id>; -- 杀死导致死锁的查询线程
innodb_lock_wait_timeout
参数来调整锁等待超时时间。SET GLOBAL innodb_lock_wait_timeout = 50; -- 设置锁等待超时时间为50秒
领取专属 10元无门槛券
手把手带您无忧上云