情况:多个前端(例如Silverlight,ASP)共享一个后端服务器(WCF RIA或其他Web服务)。
我正在寻找一个标准来防止多人编辑同一个表单。我知道这不是一个容易的主题,但要求是要求。
以前,我使用数据库上次修改日期来提交数据,如果数据在加载后被修改,则会发出警告或错误。初始系统只是在没有任何警告的情况下覆盖数据。问题是我有一个新的要求来防止这两种情况。会有很多UI,因此锁定系统可能是一个挑战,显然无法保证客户端不会在编辑过程中关闭窗口/浏览器。
我将不胜感激。
答案 0 :(得分:8)
如果我是对的,那么您所谈论的似乎是一种退房/编辑/登记方式工作流程。您希望当一个用户正在编辑记录时,其他用户甚至无法开始编辑同一记录。
这是悲观并发的一种形式。许多Web和数据访问框架都支持(相关的)乐观并发 - 也就是说,当您尝试保存时,他们会告诉您其他人已经更改了记录。乐观没有锁定的概念,确实 - 它确保在您获取的时间和您保存的时间之间没有其他用户保存。
您想要的并不是Web上的简单要求,因为当用户中止编辑时(例如,通过关闭浏览器),服务器实际上无法强制执行签入。我不知道有任何框架可以解决这个问题。
基本上您需要的是在服务器上保存结帐信息。编辑时的用户进程需要请求结帐,服务器将根据他们检出的内容授予/拒绝这个。服务器还必须保存资源被检出的信息。当用户保存服务器时,释放锁定并在请求时允许新的结账。当用户中止编辑时出现问题 - 如果是通过UI,没问题......只需告诉服务器释放锁定即可。
但如果是通过关闭浏览器,关闭机器等,那么你就有了一个孤儿锁。大多数人解决这两种方式之一: 1.暂停锁将最终被释放。这里的好处是它相当容易和可靠。缺点是记录被锁定了一段时间,而不是真正的编辑。而且,你必须让你的超时足够长,如果用户花了很长时间保存它们就不会出现错误,因为锁定超时(并且它们必须重新开始)。 2.心跳。用户定期ping回服务器说“是的,仍在编辑”。这基本上是来自#1的超时选项,但是具有可以根据需要刷新的非常短的超时。好处是你可以任意缩短。缺点是复杂性和网络使用率增加。
如果您已经拥有一个交易持久性商店(如数据库),那么签入/结帐令牌实际上并不难实现:困难的部分是将其集成到您的用户体验中。