본문 바로가기
공부/Mysql

[RealMysql 8.0]5 트랜잭션과 잠금 네임드락 5.2.3 ~ 5.2.4

by 띵커베르 2023. 2. 4.
728x90
  • 네임드 락(Named Lock)
    • GET_LOCK() 함수를 이용해 문자열에 대해 잠금을 설정할 수 있다.
    • 단순히 사용자가 지정한 문자열에 대해 획득하고 반납하는 잠금이다.
    • 자주 사용되지 않는다.
    • 음..보다가 궁금증이 생겨 찾아봤다..굳이 네임드 락을 걸어야할까 그냥 레코드 락 걸면안되나?
      • 레코드 락은 특정 레코드에 대한 접근을 제어하는 것이고, 네임드 락은 특정 테이블 이나 리소스에 대한 접근을 제어하는 것이다.
      • 같은 테이블에서 여러 트랜잭션이 동시에 수행될 경우, 레코드 락은 특정 레코드만 잠글 수 있어서 문제가 발생할 수 있다.
      • 네임드 락 같은 경우 테이블 전체에 대한 접근을 제어하기 때문에 같은 테이블에서 동시에 수행되는 트랜잭션을 모두 제어할 수 있다.
      • 따라서 네임드 락을 설정하는 것은 트랜잭션 간의 경합을 막기 위해서 사용할 수 있다.
    • 메타데이터 락
      • 데이터베이스 객체(대표적으로 테이블이나 뷰 등)의 이름이나 구조를 변경하는 경우에 획득하는 잠금이다.
      • 명시적으로 획득하거나 해제할 수 있는 것이 아니고 테이블의 이름을 변경하는 경우 자동으로 획득한다.
      • rename table 명령의 경우 원본 이름과 변경될 이름 두개 모두 한꺼번에 잠금을 설정한다.
      • 실시간 테이블을 바꿔야 하는 요건이 배치 프로그램에서 자주 발생하는데..
        • 1.임시테이블 rank_new 애 서비스용 랭킹 데이터 생성 
        • 2.랭킹 배치가 완료되면 rank를 rank_backup 으로 백업
        • 3.rank_new 테이블을 rank 로 대체
        • ex) rename table rank TO rank_backup, rank_new TO rank
        • 위와 같이 하나의 rename table 명령문에 두개의 rename 작업을 한꺼번에 실행하면 Table not found rank 같은 상황이 발생하지 않고 적용이 가능하다
        • 하지만 아래와 같이 2개로 나눠서 실행하면 아주 짧은시간이지만 rank 테이블이 존재하지 않는 수간이 생기며 그 순간에 Table not found rank 오류를 발생시킨다
          • rename table rank TO rank_backup;
          • rename table rank_new TO rank;
      • 때로는 메타데이터 잠금과 InnoDb의 트랜잭션을 동시에 사용해야 하는 경우도 있다.
728x90

댓글