2011-12-09 110 views
0

假設我有一個網站,網站上有2個用戶。mysql插入組?

這兩個都加載一個php頁面,它將1000個大行插入到mysql中,它使用for循環加載它們。

眼下,刀片交叉,例如,從用戶1,那麼3月15日從插入用戶2,然後從5用戶1 ...

我怎樣才能使它所以如果用戶1個負載php文件,那麼用戶2必須等到用戶1完成插入所有1000行後才能開始用戶2?

+0

你試過表鎖嗎? http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html - 但是,如果執行時間足夠長,「user2」的腳本可能會超時......並且如果有的話是很多用戶,幾乎可以肯定的是,那些進一步排隊的人會超時。 – CD001

+0

你如何插入行?你是否創建了一個具有多個值的INSERT語句?還是你分別插入每一行? – liquorvicar

回答

0

使用MySQL插入延遲,這裏是文檔:http://dev.mysql.com/doc/refman/5.5/en/insert-delayed.html

它會排隊你插入查詢,只是當一個人完成其它將開始。但是,如果您想在發送第二個查詢之前加入用戶的所有查詢,則這會變得更加複雜,也許內存中的臨時表可以幫助您在實際插入前保存用戶會話表。但我認爲插入延遲將解決您的問題。

+0

我正在調查此問題。謝謝! – David19801

0

PHP沒有用於在會話之間進行同步的內置機制。

但是,您可以在數據庫中引入虛擬文件或虛擬表,其中包含實際使用數據庫的人的信息。當用戶完成時,這個信息應該被刪除,這意味着數據庫再次是空閒的。

0

而不是有一個虛擬表,使用memcache,並且每當用戶嘗試訪問數據庫時,並且在授予訪問權之前,在memcache中設置一個可變參數,每當檢查到memcache變量時。它可以用與操作系統中使用的semphore相同的概念來實現,以鎖定處理器。

0

我不知道你正在保存的數據的種類,以及爲什麼你需要讓用戶2等待用戶1完成插入,也不知道你需要哪種可用性。 但是,我會將問題從PHP腳本移動到數據庫。

如果你不需要訪問插入的數據immediatley我會這樣。 我會考慮使用一箇中間表,您可以將用戶1和用戶2的所有INSERT置入,而不管數據的唯一性如何。 然後,在MySQL中,我會編寫一個存儲過程,定期從定時事件調用,該過程從此中間表中獲取所有記錄並存儲在正確的表中,刪除重複項。這取決於你的設計,只需使用SELECT DISTINCT或GROUP BY即可。

該方法將併發問題從PHP轉移到數據庫。它使PHP腳本非常簡單和可擴展:不需要跟蹤可能複雜的併發機制,如果明天你將有三個或更多的併發腳本而不是兩個,只需添加並且所有腳本仍然有效。 從用戶的角度來看,您沒有任何延遲執行。

唯一的缺點是,在INSERT後您不會立即獲得所有數據,因爲您必須等待數據庫事件運行。但是,如果您謹慎地編寫存儲過程,則甚至可以每10或5分鐘調用一次。相反,如果您需要在插入時幾乎實時地訪問插入的數據,則可以通過使用觸發器而不是定時事件來部分修改此方法。 我仍然保留一箇中間表作爲緩衝放置所有數據,然後用觸發器(更新後)我將檢查剛剛插入的記錄是否已經存在於目標表中,並且只有在不存在時才放在那裏。