在多用户并发访问的系统中,数据一致性是核心挑战。乐观锁和悲观锁作为两种经典的并发控制策略,在不同业务场景中发挥着关键作用。本文将结合实际案例深入分析两者的应用差异。
在金融系统中,当用户执行转账操作时,系统会使用SELECT...FOR UPDATE语句锁定账户记录:
BEGIN TRANSACTION;
SELECT balance FROM accounts WHERE account_id = 123 FOR UPDATE;
-- 检查余额并执行扣款
UPDATE accounts SET balance = balance - 100 WHERE account_id = 123;
COMMIT;
这种机制确保在转账过程中其他交易无法修改账户余额,防止超额支出。
在线选座业务中,当用户选择座位时:
SELECT * FROM seats WHERE seat_id = 'A12' AND status = 'available' FOR UPDATE;
-- 如果查询成功,立即更新状态为锁定
UPDATE seats SET status = 'locked', user_id = 456 WHERE seat_id = 'A12';
这种方案防止多个用户同时选择同一座位,避免座位冲突。
在高并发秒杀场景中,采用版本号机制:
UPDATE products
SET stock = stock - 1,
version = version + 1
WHERE product_id = 1001
AND version = #{currentVersion}
AND stock > 0;
通过检查更新行数判断是否成功,失败则提示用户重新尝试,有效应对瞬时高并发请求。
在线文档系统使用乐观锁处理多人同时编辑:
UPDATE documents
SET content = #{newContent},
update_time = NOW(),
version = version + 1
WHERE doc_id = 2001
AND version = #{clientVersion};
当版本号不匹配时,提示用户刷新获取最新版本,避免编辑冲突。
| 对比维度 | 悲观锁 | 乐观锁 |
|---|---|---|
| 适用场景 | 写操作频繁,冲突概率高 | 读多写少,冲突概率低 |
| 实现方式 | 数据库行锁/表锁 | 版本号/时间戳机制 |
| 系统开销 | 加锁开销大 | 冲突检测开销小 |
| 并发性能 | 低并发下表现好 | 高并发下扩展性强 |
合理选择锁机制不仅能保证数据一致性,还能显著提升系统性能。开发者应根据具体业务场景的并发特性和数据冲突概率,选择最适合的并发控制方案。