DataBase/MySQL

MySQL - MySQL 엔진의 잠금. Lock

비뀨_ 2023. 3. 2. 03:25

Lock은 Transaction과 비슷하게 보일수도 있지만

Lock은 동시성을 제어하기 위한 기능이고, Transaction은 데이터의 정합성을 보장하기 위한 기능이다.

 

DB가 만들어진 목적은 여러사람이 데이터를 저장하기 위함이다.

Lock이 없다면 여러사람이 하나의 데이터를 여러 Connection에서 접근해 동시에 데이터를 변경할 수 있다.

 

 

MySQL 엔진의 잠금

MySQL에서 사용되는 잠금은 스토리지 엔진 레벨, MySQL 엔진 레벨이 있다.

  • 스토리지 엔진 : 
    • 스토리지 엔진 간 상호 영향을 끼치지 않음 - InnoDB는 InnoDB만, MyISAM은 MyISAM만
  • MySQL 엔진 : 스토리지 엔진을 제외한 나머지 부분
    • 모든 스토리지 엔진에 영향을 미침 - InnoDB, MyISAM 등 모든 엔진에 영향 
    • 테이블 락
    • 메타데이터 락
    • 네임드 락

글로벌 락 (Global Lock)

MySQL에서 사용하는 Lock 중 가장 넓은 범위에 영향을 끼치는 Lock이다 - MySQL 서버 전체에 영향을 미침

 

한 세션에서 Global Lock을 획득하면 다른 세션에서 Select 를 제외한 DML, DDL 문장을 잠궈 대기상태로 만들어버린다.

mysqldump로 일관된 백업을 받아야 할 때는 글로벌 락을 사용한다.

 

테이블 락 (Table Lock)

개별 테이블 단위로 Lock을 한다.

명시적

명시적으로 테이블 락을 획득하려면 아래와 같이 한다.

LOCK TABLES 테이블이름 [READ | WRITE];

tab_innodb 테이블에 Lock을 걸고 다른 테이블을 조회한다면 Lock이 걸려있어서 안된다라고 한다.

UNLOCK TABLES 명령어를 통해 명시적으로 건 Lock을 풀고 테이블을 조회하면 정상적으로 된다.

 

묵시적

MySQL 서버가 데이터가 변경되는 테이블에 잠금을 설정하고 변경 후 잠금을 해제한다.

  • MyISAM, Memory : 데이터를 변경하는 쿼리를 실행하면 발생한다.
  • InnoDB : 테이블 락이 설정되지만 대부분 DML에서는 무시되고 DDL의 경우에만 영향을 미친다.

네임드 락

  • GET_LOCK() 함수를 이용해  임의의 문자열에 대해 잠금을 설정할 수 있다.
  • 네임드락은 단순히 String에 대해 Lock을 획득하고 해제하는 잠금이다.
  • 자주 사용되지는 않음.
  • DB 서버 1대에 5개의 웹 서버가 접속해 서비스하는 상황에서 5대의 서버가 어떤 정보를 동기화해야할 때

메타데이터 락

데이터베이스 객체 ( View, Table 등) 의 이름이나 구조를 변경하는 경우에 획득하는 잠금.

묵시적으로 테이블의 이름을 변경하는 경우에 자동으로 획득하는 잠금.

RENAME TABLE tab_innoDB TO  tbl_innoDB