我在不同的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
让我知道您对这种方法的看法!
祝大家周末愉快!
不错,100秒的延迟只是一个例子,所以这对于一篇文章的复杂更新可能有点不切实际。你会怎么做? – Industrial 2010-05-08 11:49:44
把100秒作为“仅仅是一个例子”并不重要。重点是:不存在任何单一的这样的时间间隔,你可以放心地说:“经过这段时间之后,我可以肯定地知道该编辑不再真的在编辑这篇文章”(并且将把文章释放在内合理的时间来编辑后续的编辑谁想要做一些真正的工作)。 你想做的事情与“等待用户输入时事务处于等待状态时保持挂起状态”非常相似。这被认为是一种非常糟糕的设计技术。 – 2010-05-08 12:04:18
Seb提出了“锁定中断”的可能性,也就是说,在没有明确征得A的同意的情况下,B有可能否决A的锁定。 你可以这样做,但在某些情况下,事情可能会变成竞争用户之间的拳击比赛。允许第三方在没有通知我的情况下“分手”我所做的事情,也不完全是最有礼貌的解决方案。 – 2010-05-08 12:28:33