乐观锁与悲观锁
悲观锁,是属于数据库中的一种互斥锁机制,但是乐观锁并非真正的数据库锁。
2种锁都是数据库在应对并发操作时,防止出现资源抢夺的,基于不同人生观所实现2种解决方案。
悲观锁的基本使用:
>>> 数据库终端开始
begin; -- 开启事务
select * from db_student where student_id = 5 for update; -- 添加一把更新锁【悲观锁】
.... -- 在事务提交之前,任何第三方连接都不能修改 student_id = 5这条数据
update db_student set age = 16 where student_id = 5;
commit; -- 提交事务
<<< 数据库终端开始
悲观锁的问题:
- 提前锁定数据,形成串行化,形成阻塞,不利于性能发挥,不适用高并发场景。
- 悲观锁只能保证数据的一致性,不能保证脏数据的出现
乐观锁的出现就是为了解决悲观锁的问题。
举例:双11活动,商城里面id=5的商品的库存num=10了,现在我们要基于乐观锁和悲观锁来解决下单过程中,出现的资源抢夺现象,避免出现超卖(商品数量不能为负数)。
乐观锁:
---> begin; 开启事务
---> 先查看库存,记录当前库存 original_num=10
---> 进行下单操作,买6件
---> 付款
---> 扣除库存
update goods set num=num-6 where num=original_num and id=5; # 增加更新条件,判断库存是否还是原来
如果执行成功,则表示没有人抢,购买成功
---> commit;
如果执行失败,则表示已经有人先抢购
---> rollback;
悲观锁:
---> begin; 开启事务
---> 先给id=5的数据,加锁
select * from goods where id=5 for update;
---> 进行下单操作,买6件
---> 付款
---> 扣除库存
update goods set num=num-6 where id=5;
---> 执行成功解锁
---- commit; 提交事务
作者:piggthird
出处:https://www.cnblogs.com/piggthird/p/18138453
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本