PHP/MySQL/jQuery 悲观锁定记录

4
我一直在思考为我参与的应用程序开发一些简单的记录锁定功能。有几个用户会花费数小时来完成记录的编辑,这会导致当其他人想要修改该记录时出现问题。目前没有涉及任何锁定。
我不确定在我的情况下乐观锁定是否可靠,因为记录是通过AJAX请求保存的。我正在考虑应用某种悲观锁定;使用两个字段,如locking_user_idlocking_timestamp,我可以跟踪谁打开了记录以及上次打开时间。
但是,由于用户可能会将其打开数小时,我如何知道用户是否放弃了或只是在努力工作?我不想强制他们每5分钟更新一次——但这可能是一种可能性(每5分钟保存一次AJAX)。
也许一个jQuery进程可以在用户工作时计数,并每5分钟触发一个AJAX请求(getJSON)来更新locking_timestamp。这样我就可以维护谁正在处理记录。当时间戳变得“旧”时,我可以假设用户不再使用该记录。有没有人有这种锁定的经验?
3个回答

3

使用AJAX请求更新锁定时间戳是一种不错的策略,并且可以很好地工作。

然而,我认为5分钟的间隔有点长。除非您的流量非常高,否则从用户的角度来看,30秒左右会更好。想象一下,如果另一个用户打开了记录并关闭了浏览器,某人必须等待5分钟...


你有没有关于使用jQuery代码创建基于计数器的AJAX(更新locking_timestamp)的建议?我相信这已经做过了。 - jjwdesign
@jjwdesign,只需要使用JavaScript的setInterval函数定期执行你的AJAX调用。 - linepogl

1
也许我有点儿傻,但是怎么样让jQuery监视页面上的鼠标和键盘事件呢?
PHP会在文件系统中的某个地方放置锁定或在数据库条目中设置某些标志,因此下一个用户将无法编辑而只能查看信息。该文件将包含条目中的用户信息,因此仅接受他的更改。
当第一个用户在页面上活动时,什么也不会发生。如果用户3分钟内没有任何操作,他将被提示确认是否仍在进行工作,否则他将在3分钟内失去当前的更改。如果他确认,什么也不会发生,但如果他不确认,则Ajax将删除锁。

我不确定能否实现它,因为许多系统用户处理页面上的信息速度较慢。其中很多都是研究相关的。但是,感谢您提供的概念想法。 - jjwdesign

1
如果您说用户在提交记录之前可能需要几个小时,那么简单的5分钟锁定或其他措施是不够的。相反,为什么不实现一种签入/签出功能,在编辑记录时激活(签出),并在规定时间内保持活动状态,并在保存记录/会话过期/关闭浏览器等情况下停用(签入)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接