我理解乐观锁定和悲观锁定之间的区别。现在,谁能给我解释一下,我一般什么时候使用这两种方法?
这个问题的答案是否会随着我是否使用存储过程来执行查询而变化?
但是为了检查一下,乐观的意思是“阅读时不要锁定表”,而悲观的意思是“阅读时锁定表”。
我理解乐观锁定和悲观锁定之间的区别。现在,谁能给我解释一下,我一般什么时候使用这两种方法?
这个问题的答案是否会随着我是否使用存储过程来执行查询而变化?
但是为了检查一下,乐观的意思是“阅读时不要锁定表”,而悲观的意思是“阅读时锁定表”。
当前回答
关于乐观锁定和悲观锁定,上面已经说了很多好的东西。 需要考虑的一个重要问题如下:
在使用乐观锁定时,我们需要注意应用程序如何从这些故障中恢复。
特别是在异步消息驱动的体系结构中,这可能导致消息处理无序或更新丢失。
需要仔细考虑失败场景。
其他回答
在大多数情况下,乐观锁定的效率更高,性能也更高。在悲观锁定和乐观锁定之间进行选择时,请考虑以下因素:
Pessimistic locking is useful if there are a lot of updates and relatively high chances of users trying to update data at the same time. For example, if each operation can update a large number of records at a time (the bank might add interest earnings to every account at the end of each month), and two applications are running such operations at the same time, they will have conflicts. Pessimistic locking is also more appropriate in applications that contain small tables that are frequently updated. In the case of these so-called hotspots, conflicts are so probable that optimistic locking wastes effort in rolling back conflicting transactions. Optimistic locking is useful if the possibility for conflicts is very low – there are many records but relatively few users, or very few updates and mostly read-type operations.
乐观锁定用于不期望发生太多冲突的情况。进行正常操作的成本较低,但如果碰撞确实发生,您将支付更高的代价来解决它,因为交易被中止。
悲观锁定在预期发生碰撞时使用。会违反同步的事务被简单地阻塞。
为了选择合适的锁定机制,您必须估计读取和写入的量并相应地进行计划。
乐观锁定和悲观锁定是数据库中锁定数据的两种模型。
乐观锁定:仅在向数据库提交更改时才锁定记录。
悲观锁定:在编辑记录时锁定记录。
注意:在两种数据锁定模型中,锁都是在将更改提交给数据库后释放的。
关于乐观锁定和悲观锁定,上面已经说了很多好的东西。 需要考虑的一个重要问题如下:
在使用乐观锁定时,我们需要注意应用程序如何从这些故障中恢复。
特别是在异步消息驱动的体系结构中,这可能导致消息处理无序或更新丢失。
需要仔细考虑失败场景。
乐观锁定意味着在读取一行时不使用排他锁,因此不会防止丢失更新或写倾斜。所以,使用乐观锁定:
如果没有发生丢失的更新或写倾斜。 或者,即使发生更新丢失或写倾斜也没有问题。
悲观锁定意味着在读取一行时使用排他锁定,从而防止丢失更新或写倾斜。所以,使用悲观锁定:
如果发生更新丢失或写倾斜。 或者出现丢失更新或写倾斜等问题。
在MySQL和PostgreSQL中,SELECT FOR UPDATE可以使用排他锁。
你可以检查我丢失更新的答案,并在MySQL中使用乐观锁定(不使用SELECT FOR update)和悲观锁定(使用SELECT FOR update)编写倾斜示例。