database - 乐观锁与悲观锁

标签 database transactions locking optimistic-locking pessimistic-locking

我了解乐观锁定和悲观锁定之间的区别。现在,有人可以向我解释一下我一般什么时候会使用其中任何一个吗?

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

但只是检查一下,乐观意味着“在读取时不锁定表”,悲观意味着“在读取时锁定表”。

最佳答案

Optimistic Locking是一种策略,您读取记录,记下版本号(执行此操作的其他方法涉及日期、时间戳或校验和/哈希)并在写回记录之前检查版本是否未更改。当您写回记录时,您会过滤版本的更新以确保它是原子的。 (即在您检查版本和将记录写入磁盘之间尚未更新)并一键更新版本。

如果记录是脏的(即与您的版本不同),您将中止事务并且用户可以重新启动它。

此策略最适用于大容量系统和三层架构,在这些系统和三层架构中,您不必为 session 维护与数据库的连接。在这种情况下,客户端实际上无法维护数据库锁,因为连接是从池中获取的,并且您可能不会从一次访问到下一次访问使用相同的连接。

Pessimistic Locking是指您将记录锁定为独占使用,直到您使用完毕为止。它比乐观锁定具有更好的完整性,但要求您小心应用程序设计以避免 Deadlocks 。要使用悲观锁定,您需要直接连接到数据库(通常是 two tier client server 应用程序中的情况)或可以独立于连接使用的外部可用事务 ID。

在后一种情况下,您使用 TxID 打开事务,然后使用该 ID 重新连接。 DBMS 维护锁并允许您通过 TxID 恢复 session 。这就是使用两阶段提交协议(protocol)(例如 XACOM+ Transactions )的分布式事务的工作方式。

关于database - 乐观锁与悲观锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/129329/

相关文章:

c# - "The operation is not valid for the state of the transaction"错误和交易范围

java - 为什么我的交易没有提交?

java - 在 lockObject 上同步和使用它作为锁有什么区别?

c++ - shared_timed_mutex 在 OS X 10.11.2 上不可用?

php - 使用删除按钮从数据库中删除记录

database - 数据库表命名空间是否存在?

database - 在 RDS 实例上收缩 pg_toast

php - 如果在事务期间失败,则删除文件,如何恢复/回滚之前执行的查询

Mysql子查询锁定

mysql - 使用 GUID 与选择 WHERE 相比,选择速度更快?