MySQL中的表锁是一种用于控制多个事务对表访问的机制。表锁可以防止多个事务同时修改同一张表的数据,从而避免数据不一致的问题。MySQL提供了两种主要的表锁类型:共享锁(Shared Locks)和排他锁(Exclusive Locks)。
要查看MySQL中当前的表锁情况,可以使用SHOW ENGINE INNODB STATUS命令。这个命令会返回InnoDB存储引擎的状态信息,其中包括当前的锁情况。
SHOW ENGINE INNODB STATUS;在返回的结果中,找到TRANSACTIONS部分,可以看到当前的事务及其锁情况。
假设有一个名为users的表,当前有一个事务正在对其进行修改操作:
START TRANSACTION;
UPDATE users SET status = 'active' WHERE id = 1;此时,可以使用以下命令查看当前的表锁情况:
SHOW ENGINE INNODB STATUS;在返回的结果中,找到TRANSACTIONS部分,可以看到类似如下的信息:
---TRANSACTION 3730028, ACTIVE 10 sec updating or deleting
mysql tables in use 1, locked 1
LOCK WAIT 3 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1
MySQL thread id 123456, OS thread handle 0x7f8d9d0f1700, query id 7890123 localhost root updating
UPDATE users SET status = 'active' WHERE id = 1
------- TRX HAS BEEN WAITING 10 SEC FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 123 page no 4 n bits 72 index `PRIMARY` of table `test`.`users` trx id 3730028 lock_mode X locks rec but not gap waiting
Record lock, heap no 1 PHYSICAL RECORD: n_fields 5; compact format; info bits 0
0: len 4; hex 80000001; asc ;;
1: len 6; hex 00000000005f; asc _;;
2: len 7; hex f80000000001; asc ;;
3: len 30; hex 4d6172795f6e616d65; asc My_name;;
4: len 3; hex 01; asc ;;从上述信息中可以看到,当前有一个事务(ID为3730028)正在等待获取排他锁(X锁),并且锁定的记录是users表的主键为1的记录。
innodb_lock_wait_timeout参数设置锁等待的超时时间,避免长时间等待锁。