zoukankan      html  css  js  c++  java
  • MYSQL定时任务

    这里我们要完成的定时任务,比较简单

    效果:每过X秒 某一些用户积分 加X

    第一步:我们先创建一个表和插入数据

    复制代码
    /* 创建一个表 */
    CREATE TABLE `test_name` (
    `id`  int(11) NOT NULL AUTO_INCREMENT COMMENT '主键,自增' ,
    `user_name`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '用户名' ,
    `integral`  int(11) NULL COMMENT '积分' ,
    `is_adm`  tinyint(1) NULL COMMENT '管理员,1-是,0-不是' ,
    PRIMARY KEY (`id`)
    )
    ENGINE=MyISAM
    DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
    CHECKSUM=0
    DELAY_KEY_WRITE=0
    ;
    
    /* 添加数据 */
    INSERT INTO `test_name` VALUES ('1', '会员1', '0', '1');
    INSERT INTO `test_name` VALUES ('2', '会员2', '0', '0');
    INSERT INTO `test_name` VALUES ('3', '会员3', '0', '0');
    复制代码

    看看效果:

    ok,表和数据做好了,我们说一下需求:

    需求1:没经过2秒管理员的积分加1,字段is_adm为1的则是管理员

    以上为添加表和数据,并提出需求

    --------------------------------分割线--------------------------------

    以下内容,我们会提到如何启动定时任务,来完成我们的需求

    首先第一步,我们要检查我们数据库,是否开启了event(事件)

    SHOW VARIABLES LIKE 'event_scheduler' #查看状态

    运行以上代码,如果你的结果,Value字段的值为"OFF",代表你的事件属于关闭状态,那么我们就要开启它,运行以下代码:

    SET GLOBAL event_scheduler = ON;  #ON开启,OFF关闭

    运行之后,再返回上一个,再次检查事件的状态,当结果为"ON",则代表你的事件已开启,我们就继续往下走。。

    既然是定时任务,那么我们就要封装一个函数,流程是这样的:

    1. 封装一个函数
    2. 封装一个事件
    3. 事件开始运行,满足条件,调用 1(封装的函数)

    那么我们先来封装一个函数:

    复制代码
    #写一个函数  begin------------
    CREATE PROCEDURE test() 
    BEGIN 
    update test_name SET integral= integral + 1 WHERE is_adm = 1; 
    END; 
    #写一个函数  end------------
    复制代码

    运行以上代码成功之后,大家不用提心吊胆,不会立刻修改你的数据,因为这里只是封装了一个函数,我们并没有调用它,它仅仅是存在。所以需要写一个事件,来调用它

    复制代码
    #写一个事件  begin------------
    create event if not exists e_test 
    on schedule every 2 second 
    on completion preserve 
    do call test(); 
    #写一个事件  end------------
    复制代码

    运行以上代码,成功之后,大家也别着急,还不会立刻运行此事件。虽然在上面,我们已经开启了event。但是我们还要单个来运行,指定一个事件来运行,就跟访问接口一样,指定一个接口。。。

    #开启事件
    alter event e_test ON 
    COMPLETION PRESERVE ENABLE; 

    这里能看见,开启事件,指定的是 e_test 这个事件名字,跟我们上面创建的是一样的,那么运行这一段代码之后,你会发现,你的表 test_name 里,is_adm = 1 的行,字段为 integral(积分) 的会每 2秒 加1

    那么一个简单的定时任务,我们完成了。

    噢,对了,关闭单个事件,使用以下的代码:

    #关闭事件
    alter event e_test ON 
    COMPLETION PRESERVE DISABLE; 

    运行之后,就会停止对 e_test 事件的使用

    以上需要注意:

    • event默认情况下,都是OFF关闭状态,在MYSQL配置里可以找到,如果你在配置里修改成ON,就会默认成ON了
    • 关闭数据库之后,如果你的event还是OFF,也会因为配置里默认的OFF因为,而停止
    • event关闭之后,你的单个事件属于开启状态,那么当你开启event之后,单个事件状态依旧是开启的
    • 如果你要关闭某个事件,请使用最后一个“关闭事件”的代码来关闭,不要使用event关闭,会影响到其他的事件
    • event如同是总闸,关闭之后,所有定义的事件断电

    原文:https://www.cnblogs.com/longfeng995/p/9330768.html

  • 相关阅读:
    HDU 3081 Marriage Match II
    HDU 4292 Food
    HDU 4322 Candy
    HDU 4183 Pahom on Water
    POJ 1966 Cable TV Network
    HDU 3605 Escape
    HDU 3338 Kakuro Extension
    HDU 3572 Task Schedule
    HDU 3998 Sequence
    Burning Midnight Oil
  • 原文地址:https://www.cnblogs.com/showcase/p/10874499.html
Copyright © 2011-2022 走看看