GET_LOCK (str, timeout)
문자열로 주어진 이름의 Lock을 획득하려 시도한다. 최대 timeout (seconds) 만큼 대기한다. timeout에 음수가 들어오면, 무한히 대기한다. 이때 획득하는 Lock은 베타락이다. 한 세션에 Lock을 획득하면, 같은 이름에 대해 다른 세션은 Lock을 획득할 수 없다.
Lock 획득이 성공하면 1을 반환하고, 타임아웃되면 0을 반환한다. 만약 error가 발생하면 NULL을 반환한다.
GET_LOCK 을 통해 획득한 lock은 RELEASE_LOCK 을 통해 명시적으로 해제되어야 한다. 또는 session이 종료되면 암시적으로 해제된다. GET_LOCK 을 통해 획득한 락은 트랜잭션이 커밋, 롤백이 된다고 해서 해제되지 않는다.
GET_LOCK 은 Metadata Locking (MDL) 서브시스템을 활용해 구현되어 있다. 한 세션에서 여러 Lock을 획득할 수 있다.
SELECT GET_LOCK('lock1',10); # 1 반환
SELECT GET_LOCK('lock2',10); # 1 반환
SQL
복사
한 세션에서는 같은 이름에 대해 여러번 락을 활용할 수도 있다. 여러번 획득한 경우, 그 세션이 락을 여러번 해제할 때까지 다른 세션은 락에 접근할 수 없다.
GET_LOCK 을 통해 획득한 락은 performance_schema.metadata_locks 테이블에서 확인할 수 있다.
해당 테이블의 OBJECT_TYPE 이란 column은 USER LEVEL LOCK 으로 고정이고, OBJECT_NAME 이란 column은 lock의 이름을 의미한다. 동일한 이름으로 여러 락이 획득되더라도 metadata_locks테이블에는 1개의 row로만 표현된다. 해당 이름의 락이 해제될 때 metadata_locks 에서 데이터가 사라진다.
여러 락을 획득할 수 있다는 의미는 deadlock을 발생시킬 수 있다는 의미이다. 만약 deadlock이 발생된다면 ER_USER_LOCK_DEADLOCK 에러가 나오게 된다. 이 에러는 트랜잭션을 롤백시키지는 않는다.
락 이름은 최대 64자까지만 가능하다.
여러 Client가 락 획득을 위해 기다리는 경우 어떤 Client가 락을 획득할지는 미지수이다. 꼭 락을 신청한 순서대로 획득하는 것은 아니다.
GET_LOCK은 statement-based replication에 안전하지 않다. binlog_format 을 STATEMENT로 설정하는 경우 warning log가 나오게 된다.