你好
我想知道在3层应用程序中实现并发控制的最佳方法吗?
可能首先想到的是:

  • 客户端想要编辑数据集中的记录。
  • 向服务器发送请求,要求对该记录进行锁定
  • 服务器根据锁定表
  • 接受/拒绝编辑请求

    根据这种情况,锁应同时引用锁定的记录和使用该记录的客户端。
    客户端必须向服务器发送定期的保持 Activity 消息。保持 Activity 状态用于释放锁定的记录,以防万一我们因编辑操作而丢失了客户端。

    我将在datasnap中使用Delphi。也许这是一个新手问题,但我不得不问!

    最佳答案

    我基于jachguate的Optimistic Concurrency Control答案来回答评论中提出的问题。

    我更喜欢在任何可能的地方使用OCC,因为实现起来比较容易。我将讨论使用object persistence framework的三层应用程序。我的首选方案分为三个级别:

  • 行或对象级别控件,其中每个对象上存储一个唯一的版本ID。如果您尝试更新对象,则版本ID会自动更改。如果您的版本ID与现有版本不匹配,则更新将失败。
  • 字段或列级别锁定。您发送原始对象的完整副本以及更新后的对象。在应用新值之前,更新中的每个字段都会比较实际值和旧值。可以要求用户解决冲突而不是丢弃冲突,但这随着提交中数据量的增加而变得困惑。
  • 悲观锁定。每个对象都有一个锁所有者,该所有者通常为空(该对象未锁定)。当您要编辑对象时,请先将其锁定。这里的问题是,需要整理锁,并且围绕它的业务规则可能很难看(希望超时是什么)。

  • 这样做的好处是,大多数情况下采用低成本OCC路径。对于发生很多但争用率低的事情,好处是巨大的。想想仓库中的产品跟踪-产品一直在移动,但很少有相同的物品同时移动,并且解决时很容易(剩下的数量=原件减去我的运抵和您的运抵)。对于(比如说)产品被重新定位的复杂情况,在运输过程中锁定产品可能是有意义的(因为这反射(reflect)了实际情况)。

    当您不得不退回到锁定状态时,能够通知两个用户并拥有一个通信 channel 通常很有用。至少在需要锁时通知需要锁的用户,最好允许他们向锁持有者发送消息,甚至允许他们强制锁。然后通知失败者“乔·史密斯已将您锁定,您的更改却丢失了”。让办公室政治来解决这个问题:)

    我通常通过用户投诉而不是错误报告来插入回退过程。如果用户提示他们在特定过程中过于频繁地丢失编辑,请对其进行更改。如果用户提示记录锁定太频繁,则必须重构对象映射以增加锁定粒度或进行业务流程更改。

    09-06 09:26