MySQL中的锁是用于控制多个事务对共享资源的并发访问。当一个事务对某个表进行修改操作时,可能会锁定该表,以防止其他事务同时对其进行修改,从而保证数据的一致性和完整性。
MySQL中的锁主要分为以下几种类型:
当需要确保数据的一致性和完整性时,可以使用锁机制。例如,在银行转账操作中,需要确保在同一时间只有一个事务能够修改账户余额,以避免出现数据不一致的情况。
要查看MySQL中被锁的表,可以使用以下SQL语句:
SHOW ENGINE INNODB STATUS;
执行该语句后,会返回InnoDB存储引擎的状态信息。在输出结果中,找到TRANSACTIONS
部分,可以看到当前正在执行的事务以及它们所持有的锁。
例如:
------------------------
LATEST DETECTED FAILURE
------------------------
...
TRANSACTIONS
------------
Trx id counter 1073741824
Purge done for trx's n:o < 1073741823 undo n:o < 0 state: running but idle
History list length 0
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 0, not started
MySQL thread id 1, OS thread handle 0x7f8d9d0f1700, query id 1 localhost root
show engine innodb status
---TRANSACTION 2837905, ACTIVE 10 sec starting index read
mysql thread id 12345, OS thread handle 0x7f8d9d0f1700, query id 666 localhost root updating
UPDATE table_name SET column1 = 'value1' WHERE id = 1
------- TRX HAS BEEN WAITING 8 SEC FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 18 page no 8204 n bits 72 index `PRIMARY` of table `database_name`.`table_name` trx id 2837905 lock_mode X locks rec but not gap waiting
Record lock, heap no 1 PHYSICAL RECORD: n_fields 5; compact format; info bits 0
...
在上面的输出结果中,可以看到事务ID为2837905的事务正在等待获取table_name
表的排他锁。
KILL TRANSACTION 2837905;
领取专属 10元无门槛券
手把手带您无忧上云