C# 如何实现脱机读写器锁定
问题的背景C# 如何实现脱机读写器锁定,c#,database,algorithm,domain-driven-design,C#,Database,Algorithm,Domain Driven Design,问题的背景 这个问题中的所有对象都是持久的 所有请求都将来自Silverlight客户端,通过二进制协议(Hessian)与应用服务器对话,而不是WCF 每个用户都有一个会话密钥(不是ASP.NET会话),它是字符串、整数或GUID(目前尚未确定) 有些对象可能需要很长时间才能编辑(30分钟或更长时间),因此我们决定使用悲观脱机锁定。悲观是因为必须协调冲突对用户来说太烦人了,脱机是因为客户端没有永久连接到服务器 我没有将会话/对象锁定信息存储在对象本身中,而是决定任何可能锁定其实例的聚合根都
- 这个问题中的所有对象都是持久的
- 所有请求都将来自Silverlight客户端,通过二进制协议(Hessian)与应用服务器对话,而不是WCF
- 每个用户都有一个会话密钥(不是ASP.NET会话),它是字符串、整数或GUID(目前尚未确定)李>
public interface ILockable
{
Guid LockID { get; }
}
这个LockID将是一个“Lock”对象的标识,该对象保存正在锁定它的会话的信息
现在,如果这是简单的悲观锁定,我就能够非常简单地实现这一点(在锁上使用递增的版本号来识别更新冲突),但我真正需要的是ReaderWriter悲观离线锁定
原因是应用程序的某些部分将执行读取这些复杂结构的操作。这些包括
- 读取单个结构以克隆它
- 读取多个结构以创建二进制文件,从而将数据“发布”到外部源
- 如果存在写入锁或排队写入锁,则无法放置读取锁
- 如果存在写入锁或排队写入锁,则无法放置写入锁
- 如果根本没有锁,则可以放置写锁
- 如果存在读锁,则写入锁将排队,而不是放置完整的写锁。(如果在X时间后读取锁未消失,则锁将退出,否则将升级)
- 无法对具有读锁的会话的写锁排队
禁止(甚至是那样),如果您还没有考虑过的话,您可能想考虑有一种方法来手动释放锁——这取决于系统的用户/角色,也许是某种易于使用的管理界面。
另外,您无疑也想到了这一点,请确保读锁数组是线程安全的。如果您真的希望自己进行锁定,我将遵循类似于线程锁定的锁定模式,例如ReaderWriterLockSlim中的锁定模式
在这种情况下,这不是一种可接受的方法,谢谢:-)它不需要是线程安全的,因为所讨论的对象是持久的,将加载到单独的对象空间中。我只需要在更新时检查冲突。至于暂停。工作线程将检查超时并释放锁。