gpt4 book ai didi

delphi - 并发控制

转载 作者:行者123 更新时间:2023-12-03 14:53:49 25 4
gpt4 key购买 nike

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

  1. 客户想要编辑数据集中的记录。
  2. 向服务器发送请求,请求锁定该记录
  3. 服务器根据锁表接受/拒绝编辑请求

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

我将使用 Delphi 和 datasnap。也许这是一个新手问题,但我必须问!!

最佳答案

我正在 jachguate 的 Optimistic Concurrency Control 上构建回答评论中提出的问题。

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

  1. 行或对象级别控制,其中每个对象上存储唯一的版本 ID。如果您尝试更新对象,版本 ID 会自动更改。如果您的版本 ID 与已有版本不匹配,则更新将失败。

  2. 字段或列级锁定。您发送原始对象和更新对象的完整副本。更新中的每个字段都会在应用新值之前比较实际值和旧值。可以要求用户解决冲突而不是丢弃它们,但是随着提交中数据量的增加,这会变得困惑。

  3. 悲观锁定。每个对象都有一个锁所有者,该所有者通常为空(该对象未锁定)。当您想要编辑对象时,您首先要锁定它。这里的问题是锁需要整理,而围绕它的业务规则可能很丑陋(什么超时是理想的)。

这样做的好处是大多数时候都采取低成本的OCC路径。对于发生很多但争用较少的事情来说,好处是显着的。想想仓库中的产品跟踪 - 产品一直在移动,但很少有相同的元素同时移动,而且当它们移动时,解决起来很容易(剩余数量 = 原始数量减去我的移除和你的移除)。对于(例如)产品被重新安置的复杂情况,在运输途中锁定产品可能是有意义的(因为这反射(reflect)了实际情况)。

当您确实必须退回到锁定时,能够通知两个用户并拥有一个沟通 channel 通常很有用。至少在锁可用时通知想要锁的用户,最好允许他们向锁持有者发送消息,甚至可能允许他们强制锁。然后通知锁丢失者“Jo Smith 已锁定您,您将丢失更改”。让办公室政治来解决这个问题:)

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

关于delphi - 并发控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5266514/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com