2011-04-30 126 views
0

假设我有一种论坛,其中包含用户/管理员可以访问/管理的主题。用户访问某个主题时出现问题:问题

当用户访问它时,首先我会检查该主题是否存在;如果用户已经访问了该主题,我会向系统添加一个标记。

这将是基本的代码:

1  if((isset($_GET['trackid'])) && (ctype_digit($_GET['trackid']))) { 
2   $query=mysql_query("SELECT date, user, zone, artist, event, data, res, complete, notes FROM topic WHERE trackid='".$_GET['trackid']."'",$mydb);  
3   if(mysql_num_rows($query)!=0) { 
4    echo "Ok, The topic exist! Now I can say to the system that I have visited the topic" 
5     
6    if (isset($_SESSION['nickname'])) $insert=mysql_query("INSERT IGNORE INTO recent_adds (user, trackid) VALUES ('".$_SESSION['nickname']."','".$_GET['trackid']."')",$mydb);     
7   } 
8  } 

现在,假设User A到达4号线,同时管理员(User B)删除此主题(trought特殊功能的管理员,但该并不意味着这么多):它会向数据库中插入不一致的数据。 (事实上​​这个话题不会再存在)。

做这种操作的主要论坛/系统如何摆脱这种并发问题?

+0

如果设置了主题视图,它很简单,这意味着有人正在查看它,因此删除应该等到主题视图在会话,cookie或数据库中处于活动状态时,才能使用您的scenerio。 – 2011-04-30 10:30:32

回答

1

您可以使用FOREIGN KEYS禁止插入任何已删除的内容。然后,您还可以获得级联删除的好处。

另一个解决方案是运行清理不一致数据的批处理作业。沿着这个解决方案的路线,不要真的删除这个话题。只需将其标记为已删除状态标记并稍后删除即可。

+0

Uhm ...看起来像一个很好的解决方案,一个与外国关键...!怎么运行的?只是把外国的关键? – markzzz 2011-04-30 10:47:37

+0

FOREIGN KEYS只允许InnoDB使用吗?呃... – markzzz 2011-04-30 10:52:50

+0

是的,它不被MyISAM支持(但这已经在手册中多年了:“在稍后阶段,MyISAM表格也会实现外键约束)”。 – 2011-04-30 11:01:56