2010-05-07 51 views
3

我在不同的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)时间戳是被检查。如果它是有效的和小于说百秒老,会出现一条消息,并且用户不能对所请求的第十条任何改变:如果用户A决定继续并保存他的更改,令牌

Warning: User A is currently working with this article. In the meantime, editing cannot be done. Please do something else with your life. 

3)与所有其他数据一起发布以更新数据库,并切换查询以删除具有标记uniqueid##的行。如果他决定采取其他措施而不是进行修改,那么文章X仍然可以在100秒内编辑,以便在012秒内完成编辑。User B

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

祝大家周末愉快!

回答

0

编辑文章总是少于100秒?

+0

不错,100秒的延迟只是一个例子,所以这对于一篇文章的复杂更新可能有点不切实际。你会怎么做? – Industrial 2010-05-08 11:49:44

+2

把100秒作为“仅仅是一个例子”并不重要。重点是:不存在任何单一的这样的时间间隔,你可以放心地说:“经过这段时间之后,我可以肯定地知道该编辑不再真的在编辑这篇文章”(并且将把文章释放在内合理的时间来编辑后续的编辑谁想要做一些真正的工作)。 你想做的事情与“等待用户输入时事务处于等待状态时保持挂起状态”非常相似。这被认为是一种非常糟糕的设计技术。 – 2010-05-08 12:04:18

+0

Seb提出了“锁定中断”的可能性,也就是说,在没有明确征得A的同意的情况下,B有可能否决A的锁定。 你可以这样做,但在某些情况下,事情可能会变成竞争用户之间的拳击比赛。允许第三方在没有通知我的情况下“分手”我所做的事情,也不完全是最有礼貌的解决方案。 – 2010-05-08 12:28:33

3

是的,这是伟大的,应该工作正常。

此外,我会添加用户B打破锁定的可能性 - 如果完全想要的话!

也就是说,可以用B's替换A的锁。这样,你可以避免时间限制,他们会看到'嘿,这是由A编辑的,而这个锁是XXX秒/分钟。你想打破这个锁?'。

有了很好的用户(即没有恶意管理员),这种方法可能比编辑一些东西只需100秒更好 - 有时您只需要更多时间。

+0

嗨塞布,这是一个很棒的主意,我真的应该实施。谢啦! – Industrial 2010-05-07 22:26:09

2

听起来像它会工作正常。如果您想对其进行非规范化并删除额外的Events表,只需将UserIdTimestamp字段添加到Articles表中,因为这是您真正需要的。

您可以轻松检查UserId是否不匹配,如果Timestamp年龄小于100秒,则显示该消息。

这样,您不必在单独的表上做任何删除操作。

2

我只是补充说,如果在页面上已经做了更新时间戳的操作,你可以每隔一分钟左右开一个AJAX查询。

相关问题