乐观锁与悲观锁

947

我理解乐观锁和悲观锁的区别,现在请问有人能够解释一下在什么情况下通常使用它们吗?

而且这个问题的答案是否会根据是否使用存储过程来执行查询而改变?

但是只是为了确认,乐观意味着“读取时不锁定表”,而悲观意味着“读取时锁定表”。


3
http://blog.couchbase.com/optimistic-or-pessimistic-locking-which-one-should-you-pick - Frank Myat Thu
3
那是一个很好的问题,特别是因为在串行化中,我读到“在任何技术类型中都应检测和考虑冲突,并且对于材料化和非材料化冲突的开销相似”。 - Little Alien
4
您可以在这里找到一个不错的解释,SO上讲述了什么是乐观锁定的根本概念 - Diego Mazzaro
2
我建议阅读马丁·福勒(Martin Fowler)的优秀著作《模式语言》:https://martinfowler.com/books/eaa.html - koppor
我认为并发控制比锁定更准确。 - Jason Law
13个回答

4

乐观锁指的是读取一行数据时不使用排他锁,因此不会阻止丢失更新写入偏斜。 因此,请使用乐观锁

  • 如果不存在丢失更新写入偏斜
  • 或者即使发生丢失更新写入偏斜也没有问题。

悲观锁意味着读取一行数据时使用排他锁,因此可以防止丢失更新写入偏斜。 因此,请使用悲观锁

  • 如果存在丢失更新写入偏斜
  • 或者如果发生丢失更新写入偏斜会有一些问题。

MySQLPostgreSQL中,可以使用SELECT FOR UPDATE排他锁

您可以查看我的答案,其中包含MySQL中使用乐观锁(不使用SELECT FOR UPDATE悲观锁(使用SELECT FOR UPDATE丢失更新写入偏斜示例。


3
在更实际的层面上,当更新分布式系统时,仅仅在数据库中进行乐观锁定可能无法为整个分布式系统提供所需的一致性。

例如,在构建在AWS上的应用程序中,通常会将数据存储在DB(例如DynamoDB)和存储中(例如S3)两个部分。如果一个更新涉及到DynamoDB和S3,则在DynamoDB中进行乐观锁定可能仍然会导致S3中的数据不一致。在这种情况下,使用悲观锁可能更加安全,该锁定将保持在DynamoDB中,直到S3的更新完成。事实上,AWS为此提供了一个 locking library


1
顺便提一下,AWS DynamoDB也支持乐观锁定。https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.OptimisticLocking.html - Big Pumpkin

1
乐观锁和悲观锁是数据库中两种数据锁定模型。

乐观锁:只有在提交更改到数据库时才会锁定记录。

悲观锁:在编辑记录时就会被锁定。

注意:在这两种数据锁定模型中,锁定会在更改提交到数据库后释放。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接