我理解乐观锁和悲观锁的区别,现在请问有人能够解释一下在什么情况下通常使用它们吗?
而且这个问题的答案是否会根据是否使用存储过程来执行查询而改变?
但是只是为了确认,乐观意味着“读取时不锁定表”,而悲观意味着“读取时锁定表”。
我理解乐观锁和悲观锁的区别,现在请问有人能够解释一下在什么情况下通常使用它们吗?
而且这个问题的答案是否会根据是否使用存储过程来执行查询而改变?
但是只是为了确认,乐观意味着“读取时不锁定表”,而悲观意味着“读取时锁定表”。
乐观锁指的是读取一行数据时不使用排他锁,因此不会阻止丢失更新或写入偏斜。 因此,请使用乐观锁:
悲观锁意味着读取一行数据时使用排他锁,因此可以防止丢失更新或写入偏斜。 因此,请使用悲观锁:
在MySQL和PostgreSQL中,可以使用SELECT FOR UPDATE
与排他锁。
您可以查看我的答案,其中包含MySQL中使用乐观锁(不使用SELECT FOR UPDATE
)和悲观锁(使用SELECT FOR UPDATE
)的丢失更新和写入偏斜示例。
例如,在构建在AWS上的应用程序中,通常会将数据存储在DB(例如DynamoDB)和存储中(例如S3)两个部分。如果一个更新涉及到DynamoDB和S3,则在DynamoDB中进行乐观锁定可能仍然会导致S3中的数据不一致。在这种情况下,使用悲观锁可能更加安全,该锁定将保持在DynamoDB中,直到S3的更新完成。事实上,AWS为此提供了一个 locking library 。
乐观锁:只有在提交更改到数据库时才会锁定记录。
悲观锁:在编辑记录时就会被锁定。
注意:在这两种数据锁定模型中,锁定会在更改提交到数据库后释放。