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