programing

MySQL/MariaDB GET_LOCK 라이프사이클 with Events

javaba 2023. 9. 6. 22:37
반응형

MySQL/MariaDB GET_LOCK 라이프사이클 with Events

사용을 시도하는 중입니다.GET_LOCK()이벤트 스케줄러가 실행하는 이벤트를 한 번에 하나만 실행하도록 제한하는 시스템을 구현하는 MariaDB 10.0.19의 기능입니다.기본적으로 각 이벤트는 'run_lock'을 획득하려고 시도하고 성공적으로 실행되면 잠금이 사용 가능하거나 시간이 초과될 때까지 기다립니다.문제는 테스트 과정에서 저장된 프로시저가 성공적으로 완료되더라도 잠금이 해제되지 않는 경우를 많이 발견할 수 있다는 것입니다.이제 명령줄에서 테스트할 때 잠금이 세션과 연결되어 있으므로 종료하면 잠금이 해제됩니다.이벤트가 종료되는지(정상적인지 비정상적인지) 테스트/파악할 수 없는 것은 모든 잠금이 해제되는지 여부입니다.

그래서 저는 두 가지 이벤트를 만들었습니다.

DELIMITER //

DROP EVENT IF EXISTS test_lock_1;

CREATE EVENT test_lock_1
    ON SCHEDULE EVERY 1 MINUTE STARTS NOW()
DO this_event:BEGIN

   SELECT GET_LOCK('test', 75);

   SELECT SLEEP(55);

END //

DELIMITER ;


DELIMITER //

DROP EVENT IF EXISTS test_lock_2;

CREATE EVENT test_lock_2
    ON SCHEDULE EVERY 30 SECOND STARTS NOW()
DO this_event:BEGIN

   SELECT GET_LOCK('test', 25);

   SELECT SLEEP(45);

END //

DELIMITER ;

공유 잠금을 해제할 수 없음을 알립니다.정상적이든 비정상적이든 이벤트가 종료된 후 잠금이 해제되었습니다.따라서 각 이벤트는 자체 세션에서 실행되고 종료 시 모든 잠금이 해제된다고 가정합니다.

잠금이 성공적으로 획득된 경우에만 계속해야 합니다.

DELIMITER //

CREATE EVENT test_lock_1 ON SCHEDULE EVERY 1 MINUTE DO 
BEGIN

  IF GET_LOCK('test', 30) IS TRUE THEN
    SELECT SLEEP(65);
  END IF;

END //

DELIMITER ;

언급URL : https://stackoverflow.com/questions/32360624/mysql-mariadb-get-lock-lifecyle-with-events

반응형