1. 数据库锁机制概述
在数据库系统中,锁机制是确保数据一致性和事务隔离性的核心技术。当多个事务同时访问相同数据时,如果没有适当的并发控制,就会出现数据不一致的问题。想象一下超市里多个收银台同时修改同一商品的库存,如果没有锁机制,很容易出现超卖或少算的情况。
MySQL作为最流行的关系型数据库之一,提供了两种主要的锁策略:悲观锁和乐观锁。这两种策略代表了处理并发问题的不同哲学,适用于不同的业务场景。理解它们的区别和适用场景,是每个后端开发者和数据库管理员必须掌握的核心技能。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 悲观锁深度解析
2.1 悲观锁的核心思想
悲观锁(Pessimistic Lock)采取的是"先加锁再访问"的策略。它假设并发冲突是常态,因此在数据被访问前就会先加锁,确保在整个事务过程中数据不会被其他事务修改。这种策略类似于图书馆的"图书预定"系统——当你预定了某本书后,其他人就无法借阅,直到你取消预定或完成借阅。
在MySQL中,悲观锁通常通过SELECT...FOR UPDATE语句实现。这个语句会在查询数据的同时对数据加排他锁(X锁),其他事务无法对这些数据加任何锁,直到当前事务提交或回滚。
2.2 悲观锁的实现细节
让我们通过一个电商系统中的商品下单场景,详细分析悲观锁的实现:
sql复制-- 开始事务
BEGIN;
-- 1. 查询商品信息并加锁
SELECT status FROM t_goods WHERE id=1 FOR UPDATE;
-- 2. 生成订单
INSERT INTO t_orders (goods_id) VALUES (1);
-- 3. 更新商品状态
UPDATE t_goods SET status=2 WHERE id=1;
-- 提交事务
COMMIT;
关键点说明:
- 必须关闭MySQL的autocommit模式(
SET autocommit=0),否则FOR UPDATE锁会在语句执行后立即释放 - 锁的范围取决于查询条件:
- 明确指定主键时,InnoDB使用行级锁
- 未使用索引或主键不明确时,会退化为表锁
- 锁会持续到事务结束(COMMIT或ROLLBACK)
2.3 锁级别与性能影响
MySQL InnoDB的锁机制非常灵活,但
