2011-11-02 51 views
0

我有一個名爲events的表,其中包含遊戲中的事件,如建築物的建築,研究等。每個事件都有一個timestamp指示它何時完成。引擎:innoDB測試MySQL鎖定正常工作

每次頁面載入,程序都會在過去(即事件已完成)的行中快速搜索events表。它選擇這些行然後刪除它們,所以其他任何運行都不會看到並處理相同的事件。

我擔心的是如果發生兩個pagelod會發生什麼,以至於他們兩個在一個或另一個有機會刪除讀取行之前讀取相同的行,以及如果在選擇並刪除。

我在想什麼應該修復它是:

SET @now=NOW(); 
SELECT * FROM `events` WHERE `timestamp` < @now FOR UPDATE 
DELETE FROM `events` WHERE `timestamp` < @now 

,但我有一些麻煩測試它。我將如何去測試它是否正常工作?

+0

我認爲這將不起作用,因爲像MySQL中的NOW()這樣的時間函數對第二個函數只有精度。某些頁面加載將在同一秒內發生,並以毫秒爲單位進行加載。 – Xint0

+0

這很好,事件本身只對第二個精確。我想要做的是鎖定選定的行,但我也想避免任何其他進程陷入僵局。 –

回答

0

打算在這裏回答我的問題:對

使用sleep()selectdelete,並在同一時間兩個電話之間。

最終代碼:

START TRANSACTION 
SET @now=NOW() 
SELECT * FROM `events` WHERE `timestamp` < @now FOR UPDATE 
-- SLEEP(5) 
DELETE FROM `events` WHERE `timestamp` < @now 

結果:

0.000:開始交易
0.001:查詢運行,返回5行。
5.002:刪除5行。
5.008:結束交易
=====第二個電話,開始了第一次後幾秒鐘:
0.000:開始交易
2.562:查詢運行,返回0行。
2.562:刪除了0行。
2.562:結束交易

這就是睡眠。沒有睡眠都在0.002秒內結束。

相關問題