管理主题编辑并发的最佳方法

时间:2011-04-27 12:24:00

标签: php mysql concurrency

我的网站上有一些数据(用PHP和MySql编写),用户可以编辑。

如您所知,如果User A打开编辑框,并且在此编辑过程中另一个User B打开相同的编辑框,则其中一个用户将丢失其修订版(首先完成的修订版)

所以我为第一个尝试编辑的用户实现了一种访问时间(20分钟)。这是代码:

$dateBlock=date("Y-m-d H:i:s");
$update=mysql_query("UPDATE tracklist SET block_user='".$_SESSION['nickname']."', block_date='".$dateBlock."' WHERE 
(trackid='".$_GET['trackid']."' AND block_user='') or 
(trackid='".$_GET['trackid']."' AND block_user='".$_SESSION['nickname']."') or 
(trackid='".$_GET['trackid']."' AND block_date<SUBTIME('".$dateBlock."', '0:20'))",$mydb);
$updatedRows=mysql_affected_rows();
if($updatedRows==0) $messaggio="Sorry but another User is editing this tracklist";

但我不喜欢这种approch。

你能给我什么建议?例如,stackoverflow上的approch是什么?

3 个答案:

答案 0 :(得分:2)

最好的方法是使第二版无效,因为你可以做出反应,推动这种情况 要以这种方式进行管理,您需要跟踪增量“editionID”,因此,如果版本ID是您接受版本的当前版本,则两个会话在开始编辑时,在第一次提交时(以及在事务上)都会返回相同的版本ID(和增加editionID),否则(给第二个浏览器)你会给出一个指示情况的消息 请记住,此方法仅在低切割概率情况下有效。

答案 1 :(得分:2)

您必须在两个选项中进行选择:

  • 正如一个答案建议:锁定文本框直到提交,特此排除其他人可以在那段时间编辑

  • 按照其他用户的建议跟踪不同的版本,而不是始终更新内容,始终使用指示版本的字段添加新内容,以便人们可以看到不同的版本版本,或者如果你想更快地做,只需跟踪提交时间,而不是你可以通过提交时间轻松地对结果进行排序

    您还可以提供的增强功能是通过将版本/提交时间与他下载的帖子进行比较,通知用户该帖子在他想要发送其编辑的那一刻打开后已更新。他可以先选择先查看并整合变化。

  • 答案 2 :(得分:0)

    最好的方法是通过websockets锁定编辑框,只要它们被其他人打开...