Mysql Event Scheduler로 데이터 상태 관리하기

조윤호·2023년 12월 6일
post-thumbnail

개요

  • 미션의 상태를 변경하기 위한 mysql 이벤트를 추가했습니다.
  • 미션에는 다음 세 가지 상태가 있으며 RECRUITING -> MISSION_PROCEEDING -> MISSION_FINISHED 으로 전환됩니다.
RECRUITING("참가자 모집중"),
MISSION_PROCEEDING("미션 진행중"),
MISSION_FINISHED("미션 종료");

Event Scheduler

RECRUITING to MISSION_PROCEEDING

CREATE EVENT update_mission_from_recruiting_to_proceeding
ON SCHEDULE EVERY 1 HOUR
STARTS CURRENT_TIMESTAMP - INTERVAL MINUTE(CURRENT_TIMESTAMP) MINUTE + INTERVAL 1 HOUR
DO
    UPDATE mission
    SET mission_status = "MISSION_PROCEEDING"
    WHERE mission_status = "RECRUITING"
    AND registration_due_date < NOW();

CREATE EVENT update_mission_from_recruiting_to_proceeding

  • 이벤트를 생성합니다.

ON SCHEDULE EVERY 1 HOUR ~~ INTERVAL 1 HOUR

  • 한시간 마다 실행되도록 설정합니다.
  • 정각에 실행되도록 현재 시각에서 분을 제해줍니다.

Do ...

  • 현재 RECRUITING 인 미션
  • 마감 기한(registration_due_date)이 지난 미션에 대해 이벤트를 실행합니다.

MISSION_PROCEEDING to MISSION_FINISHED

CREATE EVENT update_mission_from_proceeding_to_finished
ON SCHEDULE EVERY 1 HOUR
STARTS CURRENT_TIMESTAMP - INTERVAL MINUTE(CURRENT_TIMESTAMP) MINUTE + INTERVAL 1 HOUR
DO
    UPDATE mission
    SET mission_status = "MISSION_FINISHED"
    WHERE mission_status = "MISSION_PROCEEDING"
    AND mission_id IN (

        SELECT mission_id
        FROM
            (
            SELECT mission.mission_id, max_people_number, COUNT(if(status = 'MISSION_FINISHED' OR status = 'FEEDBACK_REVIEWED', 1, null)) AS count_people_number
            FROM mission
            LEFT JOIN mission_registration mr on mission.mission_id = mr.mission_id
            GROUP BY mission_id
            ) registration_status
        WHERE max_people_number <= count_people_number
    );

CREATE EVENT update_mission_from_proceeding_to_finished

  • 이벤트를 생성합니다.

ON SCHEDULE EVERY 1 HOUR ~~ INTERVAL 1 HOUR

  • 한시간 마다 실행되도록 설정합니다.
  • 정각에 실행되도록 현재 시각에서 분을 제해줍니다.

Do ... - 1

SELECT mission.mission_id, max_people_number, COUNT(if(status = 'MISSION_FINISHED' OR status = 'FEEDBACK_REVIEWED', 1, null)) AS count_people_number
FROM mission
LEFT JOIN mission_registration mr on mission.mission_id = mr.mission_id
GROUP BY mission_id;
  • 미션 등록 별 최대 인원미션을 마친 인원들의 수를 조회합니다.
  • COUNT(if(status = 'MISSION_FINISHED' OR status = 'FEEDBACK_REVIEWED', 1, null)) AS count_people_number : 미션을 마친 상태에 대해서만 카운트합니다.
image

Do ... - 2

SELECT mission_id
FROM
    (
        -- ...
    ) registration_status
WHERE max_people_number <= count_people_number;
  • count_people_numbermax_people_number에 도달했을 경우에 대해서만 mission_id를 반환합니다.
  • 해당 미션들에 대해서만 업데이트가 실행됩니다.
image

ETC

mysql에서 이벤트 스케줄러 사용하기

  • 다음 설정이 켜져 있어야 합니다.
SHOW VARIABLES LIKE 'event%';
image

실행중인 이벤트 조회하기

select * from information_schema.events;
image
  • 정상적으로 이벤트가 생성되었습니다.

Reference

https://jungeunpyun.tistory.com/64

profile
한걸음씩 성실히

0개의 댓글