乐观锁 vs. 悲观锁

ref : https://medium.com/dean-lin/真正理解资料库的悲观锁-vs-乐观锁-2cabb858726d

爲什麽要了解这个呢?

我相信工作一段时间,一定会遇到资料被重复异动、覆盖的情况,初学者可能想说,那就多设where条件啊,但这不能根本的解决这个议题,不过设定where条件想法,已经有点接触这个议题了.

以前常听同事,提到一些关键字 dead lock 、red lock 、row lock 都会一头雾水,发生dead lock 事件的时候,也不能体会他们在紧张什麽,所幸现在知道的事情多了,就想说把这个观念给记录下来吧

所以什麽是乐观锁 vs 悲观锁 ?

乐观锁、悲观锁是种概念,主要指的是针对DB table 栏位异动的限制,解决资料出现不符合预期的异动

  • 乐观锁
    • 允许多个 sql command 同时操作资料
    • 优点
      • 可以快速的完成异动
    • 缺点
      • 造成资料出现不合预期的结果
  • 悲观锁
    • 一次只能一个 sql command 操作资料,其他 command 无法在资料正在被操作时异动,只能排队等
    • 优点
      • 可以确保资料正确性
    • 缺点
      • 因为需要排队异动,因此处理时间拉长

我对乐观锁、悲观锁的理解是,乐观锁就像是信任制,会给你条件让你遵守,确保结果,悲观锁就是觉得人性本恶,所以必须用强制规定,确保结果

举个爸爸零钱箱例子

家里爸爸准备了共用零钱箱给家里两个小孩,里头固定有五百元.钱可以取用,但是当天晚上必须把钱补回500

如果爸爸采用乐观锁,制定规则

爸爸相信大家都会遵守规则,所以两位可以随时取用零钱,但是必须在当天晚上把拿走的补齐,让零钱箱固定有500

如果爸爸采用悲观锁,制定规则

爸爸才不相信大家会乖乖把钱补进去,因此每个人取用零钱,必须写下谁、在几点几分、拿走多少,反之亦然,一样当天晚上零钱桶需有500

小结

用乐观锁,取用零钱的人可以自由取用、但相对的要做到软性的要求,就是把拿走的补齐,此情况虽然方便快速,但肯定会有人性的忘记,导致结果不符合预期(晚上金额500)

用悲观锁,取用零钱的人,取用、归还时,都需要强制完成纪录的动作,否则不能达成目的,这相较乐观锁,是用强制力规范,确保结果符合预期,但相对的需要纪录支出,本身就会耗费时间

然後呢?

其实在开发过程中,没有什麽绝对,所以我们首先需要知道有这个选择,然後根据当下的情境,选择最适合的方案组合

乐观锁的情境,比较适用修改量不大、资料若真的有非预期异动,其损害也还能承受的情况

悲观锁的情境,比较适用有大量的修改量、资料不容许些微失误的情况(金额交易)


<<:  Day19. 後端工程师需要具备的前端常识

>>:  04. Unit Test x Cart Class

【C++】Binary Search Tree

Binary Search Tree的优势在於寻找、插入的时间复杂度较低,它只需要O(log n)~...

[DAY7] 手起刀落

名词解释 model 在本系列文章中,代表 ActiveRecord 自动产生的 model sch...

Vaadin 汉堡选单 - AppLayout - day16

Web 应用程序选单多样化,早期最常见的多半树状选单,直至手机问世後汉堡选单(hamburger m...

[Day1] 前言

各位朋友好! 这是第一次参加iThome铁人赛~ 本次参加主要目的是对聊天机器人抱有浓厚兴趣, 但受...

笔记-标准系统格式

Standard System Independent Formats(标准系统独立格式) Gif ...