我在不同的 Web 应用程序中看到了一个功能,包括 Wordpress(不确定?),如果用户打开数据库中的文章/帖子/页面/其他内容,而其他人正在同时编辑相同的数据,则会向用户发出警告。
我想在我自己的应用程序中实现相同的功能,并且我对此进行了一些思考。以下示例是如何执行此操作的良好实践吗?
事情有点像这样:
1)
User A
进入神秘文章X的编辑页面。查询数据库表Events
以确保当前没有其他人在编辑同一页面,到那时就没有人了。然后随机生成一个令牌,并将其插入到名为 Events
的数据库表中。
1)
User B
也想对文章 X 进行更新。现在,由于我们的 User A
已经在编辑文章,因此查询了 Events
表,如下所示:
| timestamp | owner | Origin | token |
------------------------------------------------------------
| 1273226321 | User A | article-x | uniqueid## |
2) 正在检查时间戳。如果它有效并且不到 100 秒,则会显示一条消息,并且用户无法对请求的文章进行任何更改 X:
Warning: User A is currently working with this article. In the meantime, editing cannot be done. Please do something else with your life.
3) 如果用户 A 决定继续并保存其更改,则令牌将与所有其他数据一起发布以更新数据库,并切换查询以删除带有令牌
uniqueid##
的行。如果他决定做其他事情而不是提交更改,则文章 X 仍可在 100 秒内进行编辑 User B
让我知道您对这种方法的看法!
祝大家周末愉快!
是的,这很棒,应该可以正常工作。
此外,我还添加了用户 B 打破锁定的可能性 - 如果需要的话!
即可以用B的锁替换A的锁。这样,您就可以避免时间限制,他们会看到“嘿,这正在由 A 编辑,并且此锁已存在 XXX 秒/分钟”。你想打破这把锁吗?'.
对于好的用户(即没有恶意管理员),这种方法可能比只花 100 秒编辑某些内容更好 - 有时您只是需要更多时间。
听起来效果很好。如果您想对其进行非规范化并删除额外的
Events
表,只需将 UserId
和 Timestamp
字段添加到 Articles
表中,因为这就是您真正需要的。
您可以轻松检查
UserId
是否不匹配,以及 Timestamp
是否小于 100 秒,然后显示消息。
这样,您就不必在单独的表上进行任何删除。
我只是补充一点,如果页面上执行了某些操作来更新时间戳,您可以每分钟左右触发一次 AJAX 查询。
编辑一篇文章总是需要不到 100 秒吗?
我创建了另一种方法,您应该添加一个列(正在编辑),假设用户(A)想要编辑文章X,所以当他按下(编辑)按钮时,列(正在编辑)=True,当他完成编辑列(正在编辑)= False,因此当用户(B)按下编辑按钮编辑同一篇文章(X)时,您应该检查(正在编辑)是否为真或假,如果为真则(弹出消息,文章正在由(用户 X)编辑。 我认为这将是一个完美的方法。