BEGIN
DECLARE isFreeLock TINYINT(1);
DECLARE LS TINYINT(1); SELECT IS_FREE_LOCK('SendMasSMS') INTO @isFreeLock; -- 获取锁状态
SELECT UNIX_TIMESTAMP() INTO @ts; -- 获取当前时间 IF (1 = @isFreeLock) THEN
SELECT GET_LOCK('SendMasSMS',300) INTO @LS; -- 上锁
INSERT INTO t_mastable (`MOBILES`,`CONTENT`) SELECT mobile, content FROM t_smstemp WHERE sendtime < @ts; -- 插入数据
DELETE FROM t_smstemp WHERE sendtime < @ts; -- 删除数据;
SELECT RELEASE_LOCK('SendMasSMS') INTO @LS; -- 解锁
ELSE
INSERT INTO test (`test`) VALUES (@ts); -- 记录被锁日志(调试用)
END IF;
END
这里只贴关键部分代码了。这个事件是每秒执行一次的,目的是把一个表里面的数据弄到另外一张表里面,然后把刚才转移过去的数据删除掉。
理论上说,数据量非常大,没办法在1秒钟执行完毕的情况下,我第一秒执行的时候给SendMasSMS上锁了,下一秒执行的时候,SendMasSMS应该是获取到锁定的状态,从而让if语句跳转到记录被锁日志那一行去记录日志。而实际情况是,我在t_smstemp 里面插入30w条数据(这么多,一秒钟当然处理不了),但是第一次执行的时候,get_lock并没有生效,我在终端内输入SELECT IS_FREE_LOCK('SendMasSMS'),获取到的仍然是1,而在终端内执行SELECT GET_LOCK('SendMasSMS',300),事件就会终止并且开始记录日志,说明获取锁定是没问题的。但是为什么在事件中执行GET_LOCK没有效果呢?