-- 事务要更新某行,先加意向排他锁 UPDATEuserSET name ='Alice'WHERE id =1; -- 自动加IX锁
-- 其他事务要加表锁,检查意向锁冲突 LOCK TABLES user WRITE; -- 需要等待IX释放
作用:避免加表锁时逐行检查行锁冲突。
四、锁的查看与分析
#
4.1 查看当前锁
-- MySQL 8.0 SELECT ENGINE_TRANSACTION_ID, OBJECT_NAME, OBJECT_SCHEMA, LOCK_TYPE, LOCK_MODE, LOCK_STATUS, LOCK_DATA FROM performance_schema.data_locks;
-- 查看锁等待 SELECT REQUESTING_ENGINE_TRANSACTION_ID AS waiting_trx, BLOCKING_ENGINE_TRANSACTION_ID AS blocking_trx, LOCK_TYPE, LOCK_MODE FROM performance_schema.data_lock_waits;
#
4.2 查看事务和锁(传统方式)
-- 查看InnoDB状态(包含最近死锁信息) SHOW ENGINE INNODB STATUS;
------------------------ LATEST DETECTED DEADLOCK ------------------------ *** (1) TRANSACTION: TRANSACTION 12345, ACTIVE 10 sec starting index read mysql tables in use 1, locked 1 LOCK WAIT 2 lock struct(s), heap size 1136, 1 row lock(s) MySQL thread id 100, OS thread handle 1234567, query id 500 localhost root updating UPDATE account SET balance = balance + 100 WHERE id = 2 *** (1) WAITING FOR THIS LOCK TO BE GRANTED: RECORD LOCKS space id 58 page no 3 n bits 72 index PRIMARY of table `test`.`account` trx id 12345 lock_mode X locks rec but not gap waiting Record lock, heap no 2 PHYSICAL RECORD: n_fields 4; compact format; info bits 0
*** (2) TRANSACTION: TRANSACTION 12346, ACTIVE 8 sec starting index read mysql tables in use 1, locked 1 4 lock struct(s), heap size 1136, 2 row lock(s) MySQL thread id 101, OS thread handle 1234568, query id 501 localhost root updating UPDATE account SET balance = balance + 200 WHERE id = 1 *** (2) HOLDS THE LOCK(S): ... *** (2) WAITING FOR THIS LOCK TO BE GRANTED: ...