我在不同的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##
的行。如果他决定执行其他操作而不是提交更改,则User B
的文章X在100秒内仍可用于编辑
让我知道你对这种方法的看法!
祝大家周末愉快!
5条答案
按热度按时间kq0g1dla1#
是的,这是伟大的,应该工作正常。
此外,我还想增加用户B打破锁的可能性--如果需要的话!
也就是说,用B的锁替换A的锁的可能性。这样,你可以避免时间限制,他们会看到“嘿,这是由A编辑的,这个锁是XXX秒/分钟前的。你想打破这个锁吗?”。
对于好的用户(即没有恶意管理员),这种方法可能比只有100秒的时间来编辑东西更好-有时你只是需要更多的时间。
nkkqxpd92#
如果你想反规范化它并删除额外的
Events
表,只需要在Articles
表中添加一个UserId
和Timestamp
字段,因为这就是你真正需要的。您可以轻松检查
UserId
是否不匹配,以及Timestamp
是否小于100秒,然后显示消息。这样,您就不必在单独的表上执行任何删除操作。
x759pob23#
我只想补充一点,如果页面上做了一些更新时间戳的事情,那么你可以每隔一分钟左右就触发一个AJAX查询。
2lpgd9684#
编辑一篇文章的时间总是少于100秒吗?
zaqlnxep5#
我创建了另一种方法,(正在编辑),假设用户(A)想要编辑文章X,那么当他按下(编辑)按钮时,(is editing)=True,当他完成编辑时,(正在编辑)=假,所以当用户(B)按下编辑按钮编辑同一篇文章(X)时,您应该检查是否(正在编辑)真或假,如果是真的话(消息弹出,文章正在编辑中(用户X)。我认为这将是一个完美的方法。