UPDATE user SET score = score + 10 WHERE create_time > '2023-01-01';
风险:如果未在 create_time 上建立索引,会导致全表锁
解决方案:添加合适索引 + 分批次更新
案例 2:死锁场景
-- 事务1
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;-- 事务2
START TRANSACTION;
UPDATE accounts SET balance = balance - 50 WHERE id = 2;
UPDATE accounts SET balance = balance + 50 WHERE id = 1;
死锁原因:交叉更新不同记录导致资源竞争
预防方案:统一更新顺序(例如按 id 升序操作)
八、高级锁机制
1. 自增锁(AUTO-INC Lock)
作用:保证自增主键连续性
模式:
innodb_autoinc_lock_mode=0(传统模式)
innodb_autoinc_lock_mode=1(默认,批量插入优化)
innodb_autoinc_lock_mode=2(完全交错模式)
2. 谓词锁(Predicate Lock)
应用场景:空间数据类型索引(SPATIAL INDEX)
实现方式:锁定满足查询条件的区域
理解 MySQL 锁机制需要结合具体存储引擎实现,建议通过 EXPLAIN 分析查询执行计划,配合 SET GLOBAL innodb_status_output_locks=ON; 开启详细锁信息输出。实际开发中应通过压力测试验证锁竞争情况,使用 APM 工具监控数据库锁等待时间等关键指标。