Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 防止两个用户编辑相同的数据_Mysql_Database_Editing_Integrity_Data Integrity - Fatal编程技术网

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

Mysql 防止两个用户编辑相同的数据,mysql,database,editing,integrity,data-integrity,Mysql,Database,Editing,Integrity,Data Integrity,我在不同的web应用程序中看到过一个功能,包括Wordpress(不确定?),当其他人同时编辑相同的数据时,如果用户从数据库中打开文章/帖子/页面/任何内容,就会发出警告 我想在我自己的应用程序中实现相同的功能,我对此进行了一些思考。下面的例子是如何做到这一点的良好实践吗 有点像这样: | timestamp | owner | Origin | token | ---------------------------------------------

我在不同的web应用程序中看到过一个功能,包括Wordpress(不确定?),当其他人同时编辑相同的数据时,如果用户从数据库中打开文章/帖子/页面/任何内容,就会发出警告

我想在我自己的应用程序中实现相同的功能,我对此进行了一些思考。下面的例子是如何做到这一点的良好实践吗

有点像这样:

|   timestamp   |   owner   |   Origin      |   token      |
------------------------------------------------------------
|   1273226321  |   User A  |   article-x   | uniqueid##   |
1)
User A
进入神秘文章X的编辑页面。查询数据库表
Events
,以确保此时没有其他人正在编辑同一页面,到那时也没有人在编辑该页面。然后随机生成一个令牌,并将其插入名为
事件的数据库表中

1)
用户B
也希望对文章X进行更新。现在,由于我们的
用户A
已经在编辑文章,因此将查询
事件
表,如下所示:

|   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的行。如果他决定做其他事情而不是提交他的更改,那么对于
用户B

让我知道你对这种方法的看法


祝大家周末愉快

是的,那太好了,应该很好用

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

也就是说,将A的锁替换为B的锁的可能性。这样,你可以避免时间限制,他们会看到‘嘿,这是一个正在编辑的,这个锁已经有XXX秒/分钟了。’。你想打破这把锁吗


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

听起来效果不错。如果您想将其反规范化并删除额外的
事件
表,只需在
文章
表中添加一个
用户ID
时间戳
字段,因为这就是您真正需要的

您可以轻松检查
用户标识是否不匹配,以及
时间戳是否少于100秒,然后显示消息


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

我要补充的是,如果在页面上做了一些事情来更新时间戳,您可以每分钟左右启动一次AJAX查询。

编辑一篇文章是否总是花费不到100秒的时间?

嗨,Seb,这是一个我真正应该实现的好主意。谢谢你,伙计!不,100秒的延迟只是一个例子,所以对于一篇文章的复杂更新来说,这可能有点不切实际。你会怎么做?你是否花了100秒作为“一个例子”并不重要。关键是:不存在任何这样的时间间隔,你可以放心地说“在这段时间间隔之后,我可以肯定,编辑不再真正编辑这篇文章”(这将在合理的时间内将文章释放出来,供后续编辑编辑,他们确实想对其进行一些真正的工作)。您想要做的事情与“在事务等待用户输入时保留挂起的锁”非常相似。这被认为是一种非常糟糕的设计技术。Seb提出了一种“锁断裂”的可能性,也就是说,B有可能在不明确要求a同意的情况下否决a的锁。你可以这样做,但在某些情况下,事情可能会演变成竞争用户之间的拳击比赛。允许第三方在不通知我的情况下“分解”我正在做的事情,这也不是最礼貌的解决方案。嗨,埃尔文,这可以通过Jquery以更高级的方式实现,如果用户仍在编辑且仍处于活动状态,则连续发送一个AJAX调用来更新时间戳。有一些很棒的插件可以检测用户的不活动,这可能会很方便!非常感谢你的想法!