场景:
例如:某系统,用户每天只能拥有一次的抽奖机会,抽过后当天就不可再抽,但是过了24:00点后用户就重新拥有一次抽奖机会。像这种 需要数据库定时对某个字段进行更新操作的任务,完全可以通过数据库本身的事件机制进行操作,而服务器端也不需要用额外的代码进行这种监控定时的操作。
Mysql:
本文讨论的是Mysql数据库,Event Scheduler事件调度器应该是在Mysql5.1引入的,所以使用定时任务调度时,请注意查看你的Mysql版本。
创建事件调度的语法:
/*
创建事件event_name
*/
DELIMITER $$
CREATE
event
IF
NOT
EXISTS
event_name
ON
SCHEDULE 任务条件
ON
COMPLETION PRESERVE DO SQL操作 DELIMITER ;
实例情景 :每半个小时更新统计字段count为0,
/* 创建定时定时更新count字段事件 */ DELIMITER $$ CREATE event IF NOT EXISTS update_count ON SCHEDULE EVERY 30 MINUTE
/*MYSQL注意时区设置,默认非中国时区*/
STARTS TIMESTAMP '2009-12-18 02:58:00' ON COMPLETION PRESERVE DO update tb_count set count=0 $$ DELIMITER ;
如上,创建了一个名叫update_count的事件,执行条件则为每30分钟执行一次,(EVERY 30 MINUTE),执行Sql为(update tb_count set count=0), 当然你可能会按天执行, 所以你也可以写(EVERY 1 DAY),
如果执行的任务Sql复杂,我们可以写触发器,直接看示例代码:
DELIMITER $$
DROP
PROCEDURE
IF
EXISTS
update_count$$
CREATE
PROCEDURE
update_count()
BEGIN
UPDATE
tb_count
SET
count
=
0
;
END
$$ DELIMITER ;
以上为创建一个存储过程update_count,执行对tb_count中count字段的更新。任务中代码中do字段后则改为 (call update_count() $$) 。当然你可能会更复杂的需求。
添加完event后,还需要查看event_scheduler是否开启,否则添加的event不会执行,移步下面的代码:
/*
查看event是否开启
*/
SHOW VARIABLES
LIKE
'
%sche%
'
;
/*
开启event
*/
SET
GLOBAL event_scheduler
=
1
;
查看和关闭你所添加的event:
/*
关闭 event
*/
ALTER
event update_count
ON
COMPLETION PRESERVE DISABLE;
/*
启用 event
*/
ALTER
event update_count
ON
COMPLETION PRESERVE ENABLE;
更多MySql语法可查看: http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html