gpt4 book ai didi

c# - 如何实现离线读写锁

转载 作者:搜寻专家 更新时间:2023-10-30 20:33:05 50 4
gpt4 key购买 nike

问题的背景

  • 这个问题中的所有对象都是持久的。
  • 所有请求都将来自 Silverlight 客户端,通过二进制协议(protocol) (Hessian) 而不是 WCF 与应用服务器对话。
  • 每个用户都有一个 session key (不是 ASP.NET session ),它可以是字符串、整数或 GUID(目前尚未确定)。

某些对象可能需要很长时间才能编辑(30 分钟或更长时间),因此我们决定使用悲观离线锁定。悲观是因为必须调和冲突对用户来说太烦人了,离线是因为客户端没有永久连接到服务器。

与其将 session /对象锁定信息存储在对象本身中,我决定任何可能已锁定其实例的聚合根都应实现接口(interface) ILockable

public interface ILockable
{
Guid LockID { get; }
}

这个 LockID 将是一个“Lock”对象的标识,该对象保存着哪个 session 正在锁定它的信息。

现在,如果这是简单的悲观锁定,我将能够非常简单地实现这一点(在 Lock 上使用递增的版本号来识别更新冲突),但我真正需要的是 ReaderWriter 悲观离线锁定。

原因是应用程序的某些部分将执行读取这些复杂结构的操作。这些包括像

  • 读取单个结构以克隆它。
  • 读取多个结构以创建二进制文件以将数据“发布”到外部源。

读锁将保持很短的时间,通常不到一秒,但在某些情况下,它们可能会保持大约 5 秒。

写锁大多会持有很长时间,因为它们主要由人持有。

很有可能有两个用户同时尝试编辑同一个聚合,也很有可能有很多用户同时需要临时读取锁定。我正在寻找关于如何实现它的建议。

另外要说明的一点是,如果我想放置一个写锁并且有一些读锁,我想将写锁“排队”,这样就不会放置新的读锁。如果读锁在 X 秒内被移除,则获得写锁,否则写锁退回;写锁排队时不会放置新的读锁。

目前我有这个想法

  1. Lock 对象将有一个版本号 (int),这样我就可以检测到多重更新冲突,重新加载,再试一次。
  2. 它将有一个用于读锁的字符串[]
  3. 一个字符串,用于保存具有写锁的 session ID
  4. 保存排队写锁的字符串
  5. 可能是一个递归计数器,允许同一个 session 多次锁定(读锁和写锁),但还不确定。

规则:

  • 如果有写锁或排队写锁,则不能放置读锁。
  • 如果有写锁或排队写锁,则不能放置写锁。
  • 如果根本没有锁,则可以放置写锁。
  • 如果有读锁,则写锁将排队,而不是放置完整的写锁。 (如果在 X 时间后读锁没有消失,则锁退回,否则升级)。
  • 无法为具有读锁的 session 排队写锁。

任何人都可以看到任何问题吗?建议替代方案?任何事物?在决定采取何种方法之前,我希望收到反馈。

最佳答案

您是否考虑过 mvcc实现:

诚然,这会更难实现,但似乎比您所解释的更并行。只是把想法扔在那里。

关于c# - 如何实现离线读写锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/538450/

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