2011-11-02 50 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秒内结束。

相关问题