MySQL乐观锁、悲观锁

乐观锁、悲观锁

  • 悲观锁,是属于数据库中的一种锁机制,但是乐观锁并非真正的数据库锁
  • 两种锁都是数据库在应对并发操作时,防止出现资源抢夺的,基于不同人生观所实现两种解决方案

悲观锁

数据库终端操作:

begin;  -- 开启事务
select * from db_student where student_id = 5 for update; -- 添加一把更新锁【悲观锁】  在事务提交之前,任何第三方连接都不能修改 student_id = 5这条数据 
commit; -- 提交事务

悲观锁问题:

1. 提前锁定数据,形成串行化,形成阻塞,不利于性能发挥,不适用高并发场景。
2. 悲观锁只能保证数据的一致性,不能保证脏数据的出现

乐观锁

乐观锁的出现就是为了解决悲观锁的问题

举例说明:

举例:双11活动,商城里面id=5的商品的库存=10了,现在我们要基于乐观锁和悲观锁来解决下单过程中,出现的资源抢夺现象,避免出现超卖(商品数量不能为负数)。

乐观锁:
---> begin;  开启事务
---> 先查看库存,记录当前库存 num=10
---> 进行下单操作,买6件
---> 付款
---> 扣除库存 update goods set num=num-6 where num=10 and id=5;  # 增加更新条件,判断库存是否还是原来
---> 如果执行成功,则表示没有人抢,购买成功
     如果执行事变,则表示已经有人先抢购
---> commit;

悲观锁:
---> begin; 开启事务
---> 先给id=5的数据,加锁
     select * from goods where id=5 for update;
---> 进行下单操作,买6件
---> 付款
---> 扣除库存  update goods set num=num-6 where id=5
---> 执行成功解锁
---- commit;  提交事务

  

上一篇:apt-get update 无法验证签名报错处理


下一篇:sudo rosdep init 或 rosdep update失败解决办法