2023-10-01 15:30:45 0x7f9a5b7f7700
* (1) TRANSACTION:
TRANSACTION 12345, ACTIVE 1 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 10, OS thread handle 1234567890, query id 123 localhost user update
UPDATE table SET column = 'value' WHERE id = 1
* (2) TRANSACTION:
TRANSACTION 67890, ACTIVE 2 sec fetching rows
mysql tables in use 1, locked 1
2 lock struct(s), heap size 1136, 1 row lock(s)
MySQL thread id 11, OS thread handle 9876543210, query id 456 localhost user select
SELECT * FROM table WHERE id = 2 FOR UPDATE
(2)调整SQL语句
添加索引:为频繁查询的字段创建索引(如`ALTER TABLE table ADD INDEX idx_name(name)`)。
避免范围查询锁:将`SELECT ..、FOR UPDATE`改为精确查询(如`WHERE id = ?`)。
使用`NOWAIT`或`SKIP LOCKED`:
sql
SELECT * FROM table WHERE id = 1 FOR UPDATE NOWAIT; 立即返回或报错
示例场景分析
假设两个事务分别执行:
sql
事务A
BEGIN;
UPDATE orders SET status = 'processing' WHERE order_id = 1;
UPDATE orders SET status = 'completed' WHERE order_id = 2;
COMMIT;
事务B
BEGIN;
UPDATE orders SET status = 'canceled' WHERE order_id = 2;
UPDATE orders SET status = 'pending' WHERE order_id = 1;
COMMIT;