乐观锁和悲观锁的一个例子

  想象一下你马上出发要去一家餐厅吃饭,但是你去之前不确定会不会满桌,你又不想排号。这时的你会有两个选择,如果你是个乐观的人,内心戏可能会是「管他的,去了再说,大不了没座就回来」。反之,如果你是一个悲观的人,可能会先打个电话预约一下,先确认下肯定有座,同时交点定金让餐厅预留好这个座位,这样就可以直接去了。
  上面这个例子很直观的对应了两种事务模型的行为,乐观事务模型就是直接提交,遇到冲突就回滚,悲观事务模型就是在真正提交事务前,先尝试对需要修改的资源上锁,只有在确保事务一定能够执行成功后,才开始提交。
理解了上面的例子后,乐观事务和悲观事务的优劣就很好理解了。对于乐观事务模型来说,比较适合冲突率不高的场景,因为直接提交(“直接去餐厅”)大概率会成功(“餐厅有座”),冲突(“餐厅无座”)的是小概率事件,但是一旦遇到事务冲突,回滚(回来)的代价会比较大。悲观事务的好处是对于冲突率高的场景,提前上锁(“打电话交定金预约”)的代价小于事后回滚的代价,而且还能以比较低的代价解决多个并发事务互相冲突、导致谁也成功不了的场景。

  再次解释背后思想:

  常规的锁是先互斥,再修改数据。不管是不是发生了冲突,我们都会先做互斥。但乐观锁不同,它是先计算出所有修改的数据,然后最后一步统一提交修改。提交时会进行冲突检查,如果没有冲突,也就是说,在我之前没有人提交过新版本,或者虽然有人提交过新版本,但是修改的数据和我所依赖的数据并不相关,那么提交会成功。否则就是发生了冲突,会放弃本次修改。

为什么要用乐观锁?至少它让锁数据库的粒度降到最低,判断冲突的逻辑也都是可预期的行为,这就避免了出现死锁的可能。我们很容易可以推理得知,在所有并行执行的事务中,必然有一个事务的提交会成功。这样就避免了饥饿(永远都没人可以成功)。

reference:

1.  https://pingcap.com/blog-cn/pessimistic-transaction-the-new-features-of-tidb/

2. 许式伟架构课

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
乐观悲观是在并发控制中常用的两种方式,用于解决数据一致性问题。下面我将为您介绍一个关于Redis乐观悲观例子乐观例子: 假设有一个电商平台,多个用户同时想要购买某个商品,但是该商品的库存只剩下1个。这时候使用乐观可以避免超卖的问题。 1. 用户A和用户B同时请求购买该商品。 2. 服务器接收到购买请求后,首先查询该商品的库存数量,发现还有1个。 3. 服务器分别给用户A和用户B生成一个唯一的订单号,并将库存数量减1。 4. 用户A提交购买请求,服务器检查库存数量,发现仍然是1个。 5. 用户B提交购买请求,服务器检查库存数量,发现已经是0个。 6. 服务器将用户B的购买请求拒绝,并给用户B返回库存不足的提示。 7. 用户A的购买请求继续处理,生成订单并返回成功的提示。 在这个例子中,通过乐观的方式,多个用户同时发起购买请求时,并发控制的操作会保证只有一个用户能够成功购买商品。 悲观例子: 假设有一个论坛系统,用户发帖时需要检查该用户是否被禁言,使用悲观可以避免用户在禁言期间仍然能够发帖的问题。 1. 用户A发起发帖请求。 2. 服务器接收到请求后,首先对该用户进行悲观的加操作,防止其他操作同时修改用户状态。 3. 服务器检查用户状态,发现用户A已经被禁言。 4. 服务器拒绝用户A的发帖请求,并返回禁言提示。 5. 服务器释放用户A的悲观,其他操作可以继续对用户进行修改。 在这个例子中,通过悲观的方式,可以确保在对用户状态进行操作时,其他操作无法同时修改用户状态,避免了用户在禁言期间仍然能够发帖的问题。 综上所述,乐观悲观是在并发控制中常用的两种方式,用于解决数据一致性问题。通过对乐观悲观例子的说明,我们可以更好地理解和应用这两种机制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值