我了解乐观锁定和悲观锁定之间的区别。 如今有人能够向我解释我何时通常使用其中一个? 数据库
并根据我是否使用存储过程执行查询而改变了这个问题的答案? 服务器
但仅检查一下,乐观的意思是“阅读时不要锁住桌子”,悲观的意思是“阅读时锁住桌子”。 并发
乐观假设您在阅读时不会有任何改变。 分布式
悲观主义者假设某件事会所以而将其锁定。 高并发
若是不必定要完美读取数据,请使用乐观的方法。 您可能会读到奇怪的“肮脏”字样-但致使死锁等可能性的可能性要小得多。 spa
大多数Web应用程序均可以进行脏读-在极少数状况下,数据不能彻底符合下一次从新加载的要求。 设计
对于精确的数据操做(例如在许多金融交易中),请使用悲观的。 准确读取数据且没有未显示的更改很是重要-额外的锁定开销是值得的。 server
哦,Microsoft SQL Server默认使用页面锁定-基本上是您正在读取的行,而且两侧都有。 行锁定更准确,但速度慢得多。 一般值得将事务设置为已提交读或未锁定,以免在读取时出现死锁。 htm
当您不但愿发生太多冲突时,将使用乐观锁定。 进行正常操做的成本较低,可是若是发生冲突,您将付出更高的代价来解决该事务,由于事务停止了。 事务
当预期发生冲突时,将使用悲观锁定。 违反同步的事务将被简单地阻止。
要选择适当的锁定机制,您必须估计读取和写入的数量并作出相应的计划。
乐观锁定是一种策略,您能够在其中读取记录,记下版本号(执行此操做的其余方法包括日期,时间戳或校验和/哈希),并在写回记录以前检查版本是否未更改。 当您将记录写回时,您将过滤该版本的更新以确保它是原子的。 (即,在您检查版本并将记录写入磁盘之间,还没有进行更新)和一次单击便可更新版本。
若是记录脏了(即与您的版本不一样),则停止事务,用户能够从新启动它。
此策略最适用于不必定要为会话保留与数据库的链接的大容量系统和三层体系结构。 在这种状况下,客户端实际上没法维护数据库锁定,由于链接是从池中获取的,而且您可能不会在一个访问到下一个访问中使用相同的链接。
悲观锁定是指您锁定记录以供独占使用,直到完成记录为止。 它具备比乐观锁定更好的完整性,可是须要您谨慎设计应用程序,以免死锁 。 要使用悲观锁定,您须要直接链接到数据库(一般在两层客户端服务器应用程序中就是这种状况)或能够独立于链接使用的外部可用事务ID。
在后一种状况下,您可使用TxID打开事务,而后使用该ID从新链接。 DBMS保持锁定状态,并容许您经过TxID备份会话。 这就是使用两阶段提交协议(例如XA或COM + Transactions )的分布式事务的工做方式。
除了已经说过的内容外,还应该说乐观锁定倾向于以牺牲可预测性为代价来提升并发性。 悲观锁定倾向于减小并发性,可是更可预测。
你付钱等等
我会想到悲观锁定将是一个更好的选择的状况。
为了实现乐观锁定,每一个数据修改参与者都必须赞成使用这种锁定方式。 可是,若是有人修改数据而不关心版本列,则将破坏乐观锁定的整个想法。