共计 1511 个字符,预计需要花费 4 分钟才能阅读完成。
在计算机编程畛域,乐观锁(Optimistic Locking
)是一种解决并发访问共享数据的策略,它的根本思维是先进行操作,而后在更新数据之前查看是否有其余并发操作批改了数据。如果没有抵触,操作能够胜利执行;如果存在抵触,零碎须要进行抵触解决,例如回滚操作、从新尝试或者告诉用户。
乐观锁的设计指标是: 尽量避免对数据进行显式的加锁
,以进步零碎的性能和并发性。
乐观锁的外围概念:在执行更新操作前,首先读取数据的一个示意(如版本号、工夫戳等),而后在更新时查看这个示意是否与预期值相匹配。如果匹配,则阐明在读取数据和执行更新之间没有其余并发操作批改数据,操作能够胜利进行;如果不匹配,则示意产生了抵触,须要进行相应的解决。
乐观锁上锁胜利的前提条件是:
- 读取数据的示意必须与更新数据时应用的示意相匹配,即在更新之前没有其余操作批改了数据。
- 操作执行期间,其余并发操作没有批改雷同数据。
以下是一个具体的例子,来阐明乐观锁的工作原理和上锁胜利的前提条件:
示例:图书库存管理系统
假如有一个在线图书商城,多个用户能够同时购买同一本图书。为了保障库存数据的一致性,咱们应用乐观锁来解决并发购买操作。
-
数据结构 :
每本图书在数据库中都有一条记录,包含图书 ID、图书名称、库存数量和版本号。版本号用于实现乐观锁。
Book Table: | BookID | BookName | StockQuantity | Version | |--------|-----------|---------------|---------| | 101 | Book A | 10 | 1 | | 102 | Book B | 15 | 2 | | ... | ... | ... | ... |
-
购买操作 :
当用户要购买一本图书时,零碎会执行以下操作:
a. 用户抉择图书并点击购买。
b. 零碎读取图书的以后版本号和库存数量。
c. 用户确认购买。
d. 零碎再次读取图书的以后版本号和库存数量,查看是否与之前的读取后果雷同。
e. 如果版本号匹配且库存数量短缺,零碎执行购买操作,将库存数量缩小,版本号递增。
f. 如果版本号不匹配或库存数量有余,示意在购买确认过程中产生了抵触,须要进行抵触解决。 -
乐观锁的工作原理 :
- 用户 A 和用户 B 同时想购买同一本图书(例如 Book A)。
- 零碎读取图书的版本号和库存数量,假如以后版本号为 1,库存数量为 10。
- 用户 A 确认购买,零碎再次读取图书的版本号和库存数量,依然是版本号 1、库存数量 10。
- 用户 B 也确认购买,零碎再次读取图书的版本号和库存数量,依然是版本号 1、库存数量 10。
- 用户 A 的购买操作先实现,将库存数量缩小为 9,并将版本号减少为 2。
- 用户 B 的购买操作尝试缩小库存数量,但发现版本号不匹配(以后为 2,而操作开始时读取的是 1),阐明在用户 B 确认购买前曾经有其余操作批改了数据,购买操作失败。
-
抵触解决 :
当用户 B 的购买操作失败时,零碎能够采取以下一些抵触解决策略:
- 回滚用户 B 的操作,提醒用户从新尝试购买。
- 告诉用户库存有余,举荐其余相干图书。
- 主动尝试从新购买,直到操作胜利或达到最大尝试次数。
乐观锁的优缺点:
长处 :
- 不会阻塞其余操作,进步了零碎的并发性能。
- 对于少数状况下没有并发抵触的场景,乐观锁能够更好地发挥作用。
毛病 :
- 须要实现抵触解决逻辑,减少了开发复杂性。
- 在高并发状况下,抵触解决可能会减少零碎的累赘。
- 无奈解决所有并发抵触,一些简单的场景依然须要应用乐观锁等其余策略。
总结
乐观锁是一种在并发拜访数据时尽量避免显式加锁的策略,它通过先进行操作再检查数据是否被批改来保证数据的一致性。上锁胜利的前提条件是读取数据的示意与更新数据时应用的示意相匹配,并且操作期间没有其余并发操作批改了雷同数据。乐观锁在一些特定的场景下能够进步零碎的性能和并发性。