防止两个用户编辑相同的数据

问题描述 投票:0回答:5

我在不同的 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

让我知道您对这种方法的看法!

祝大家周末愉快!

mysql database editing integrity data-integrity
5个回答
3
投票

是的,这很棒,应该可以正常工作。

此外,我还添加了用户 B 打破锁定的可能性 - 如果需要的话!

即可以用B的锁替换A的锁。这样,您就可以避免时间限制,他们会看到“嘿,这正在由 A 编辑,并且此锁已存在 XXX 秒/分钟”。你想打破这把锁吗?'.

对于好的用户(即没有恶意管理员),这种方法可能比只花 100 秒编辑某些内容更好 - 有时您只是需要更多时间。


2
投票

听起来效果很好。如果您想对其进行非规范化并删除额外的

Events
表,只需将
UserId
Timestamp
字段添加到
Articles
表中,因为这就是您真正需要的。

您可以轻松检查

UserId
是否不匹配,以及
Timestamp
是否小于 100 秒,然后显示消息。

这样,您就不必在单独的表上进行任何删除。


2
投票

我只是补充一点,如果页面上执行了某些操作来更新时间戳,您可以每分钟左右触发一次 AJAX 查询。


0
投票

编辑一篇文章总是需要不到 100 秒吗?


0
投票

我创建了另一种方法,您应该添加一个列(正在编辑),假设用户(A)想要编辑文章X,所以当他按下(编辑)按钮时,列(正在编辑)=True,当他完成编辑列(正在编辑)= False,因此当用户(B)按下编辑按钮编辑同一篇文章(X)时,您应该检查(正在编辑)是否为真或假,如果为真则(弹出消息,文章正在由(用户 X)编辑。 我认为这将是一个完美的方法。

© www.soinside.com 2019 - 2024. All rights reserved.