乐观锁定与悲观锁定

时间:2020-03-06 14:41:04  来源:igfitidea点击:

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

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

*但仅检查一下,乐观的意思是"阅读时不要锁定桌子",悲观的意思是"阅读时锁定桌子"。

解决方案

乐观假设我们在阅读时不会有任何改变。

悲观主义者假设某件事会因此而将其锁定。

如果不是必须要完美地读取数据,请使用乐观的方法。我们可能会读到奇怪的"脏"字,但导致死锁等可能性的可能性要小得多。

大多数Web应用程序都可以进行脏读,这在极少数情况下数据不能完全符合下一次重新加载的要求。

对于精确的数据操作(例如在许多金融交易中),请使用悲观的。准确读取数据是至关重要的,没有未显示的更改,额外的锁定开销是值得的。

哦,Microsoft SQL Server默认将页面锁定基本上是我们正在读取的行以及每一侧的页面锁定。行锁定更准确,但速度慢得多。通常值得将事务设置为已提交读或者未锁定,以避免在读取时出现死锁。

当我们不希望发生太多冲突时,将使用乐观锁定。进行正常操作的成本较低,但是如果发生冲突,我们将付出更高的代价来解决该事务,因为事务中止了。

当预计会发生冲突时,将使用悲观锁定。违反同步的事务将被简单地阻止。

要选择适当的锁定机制,我们必须估计读取和写入的数量并做出相应的计划

乐观锁定是一种策略,我们可以在其中读取记录,记下版本号(执行此操作的其他方法包括日期,时间戳或者校验和/哈希),并在写回记录之前检查版本是否未更改。当我们回写记录时,我们将过滤版本更新以确保它是原子的。 (即,在我们检查版本并将记录写入磁盘之间没有更新)并一次点击即可更新版本。

如果记录是脏的(即与版本不同),则中止该事务,然后用户可以重新启动它。

此策略最适用于不必为会话保留与数据库的连接的大容量系统和三层体系结构。在这种情况下,客户端实际上无法维护数据库锁定,因为连接是从池中获取的,并且我们可能不会在从一个访问到另一个访问的访问中使用同一连接。

悲观锁定是指我们锁定记录以供独占使用,直到完成记录为止。它具有比乐观锁定更好的完整性,但是需要我们谨慎设计应用程序,以避免死锁。要使用悲观锁定,我们需要直接连接到数据库(在两层客户端服务器应用程序中通常是这种情况)或者可以独立于连接使用的外部可用事务ID。

在后一种情况下,我们可以使用TxID打开事务,然后使用该ID重新连接。 DBMS保持锁定状态,并允许我们通过TxID备份会话。这就是使用两阶段提交协议(例如XA或者COM +事务)的分布式事务的工作方式。

除了已经说过的内容外,还应该说乐观锁定倾向于以牺牲可预测性为代价来提高并发性。悲观锁定倾向于减少并发,但是更可预测。

你付钱等等