mysql 잠금(lock)

Koder·2023년 1월 29일
0

글로벌 락(Global Lock)

FLUSH TABLES WITH READ LOCK
  • 모든 테이블의 잠금을 거는것, 주로 mysqldump에서 사용
  • 락을 건 세션 외에 다른곳에서 SELECT외의 쿼리는 락이 풀릴시까지 대기한다.

테이블 락(Table Lock)

LOCK TABLES {name} READ; // 잠금
LOCK TABLES {name} WRITE;
UNLOCK TABLES {name} READ; // 해제
UNLOCK TABLES {name} WRITE;

SHOW OPEN TABLES FROM {name}
SHOW STATUS LIKE 'Table%'; // 잠김 테이블 확인
SHOW PROCESSLIST; // 어느 클라의 잠금 상태 확인
  • 개별 테이블 단위로 락을 획득하고 점유하는 방식
  • MyISAM 및 InnoDB 모두 사용 가능하다.
  • 테이블 전체를 점유하는 락으로 특별하지 않으면 이용빈도가 낮다.

유저 락(User Lock)

SELECT GET_LOCK('testLock',2); // testLock의 잠금을 획득, 이미잠겼으면 최대 2초 대기
SELECT IS_FREE_LOCK('testLock'); // testLock이 현재 잠금 상태인지 확인
SELECT RELEASE_LOCK('testLock'); // testLock의 잠금을 반납한다.
  • 내장함수 get_lock을 이용하여 잠금을 사용할 수 있다.
  • 데이터베이스의 저장 정보와 관련 없는 문자열을 지정해놓고 점유하는 방식의 락이다.
  • 동시에 경쟁하면서 여러작업을 처리할떄 유용하다.

네임 락(Name Lock)

RENAME TABLE a to b, z to y; // 두가지의 테이블을 동시 변경 
  • 테이블,뷰와 같은 이름을 변경시 사용되는 잠금이다.
  • 명시적으로 제어할수 없고 RENAME과 같은 작업시에 동작하는것이다.

InnoDB 잠금방식

  • 낙관적 잠금(Optimistic Lock)

    각 트랜잭셔이 동시 변경될 가능성이 희박하다 보고서 별도 잠금 없이 작업을 수행해보고 충돌이 감지되면 ROLLBACK(ERROR)하는 방식

  • 비관적 잠금(Pessmistic Lock)

    변경하고자 하는 레코드에 잠금을 획득하고 작업을 처리하는 방식
    높은 동시성 처리에서 선호하는 방식이다.

InnoDB 잠금 종류

레코드 락(Record lock)

  • 점유할 범위의 레코드만 잠그는 방식
  • 실제적으로는 레코드가 아닌 인덱스의 레코드를 잠그는점이다.
  • 인데긋가 없어도 자동 생성된 클러스트 인덱스를 통해 잠근다.

갭락(Gap Lock)

  • 갭락 레코드가 아닌 레코드와 바로 인접한 사이의 간격만 잠그는것을 의미한다.
  • 갭락은 개념일뿐 자체적인 기능은 아니다.

넥스트키락(Next Key Lock)

  • 레코드락과 갭락을 합쳐놓은 잠금
  • 갭락과 넥스트 락은 바이너리 로그에 기록된 쿼리가 슬레이브에서 실행시 마스터와 같은 결과를 만들도록 보장하는것

자동증가락(Auto Increment Lock)

  • 자동증가락은 테이블에 하나만 존재하여 복수의 쿼리가 발생하면 다른 쿼리간에 경쟁이 발생한다.
  • 아주 짧은 락으로 별도로 획득하고 해제하는 방법은 없다.

Mysql Lock 변경락

세션1

SET LOCK_TIMEOUT 10*1000; // 미지정시 디폴트
update table set a=1;
  • 트랜잭션을 열어놓고 쿼리 수행중이고 커밋은 하지 않은상태

세션2

SET LOCK_TIMEOUT 10*1000;
update table set a=2;
  • 세션1이 커밋을 하지 않은상태라서 처리가 되지 않고 대기를 탄다.

세션1

COMMIT;
  • 세션1이 커밋을 하자 세션2의 뭐리가 수행될수있고 세션1이 10초안에 처리를 못한다면 세션2의 작업은 드랍된다.

Mysql 조회락

select * from pepople for update
  • 조회하는 쿼리에 락을 걸고 commit 될때까지 점유한다.
  • commit 되기전까지 다른 세션은 lock wait을 한다.
  • select for update 할때 락 획득하지 못하면 얻을때까지 대기한다.
profile
일단 적고 보자

0개의 댓글