2011-04-30 219 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