Loading...
MySQL 9.5 Reference Manual 9.5의 14.14 Locking Functions의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
이 섹션에서는 사용자 수준(lock) 잠금을 조작하는 데 사용되는 함수들을 설명합니다.
Table 14.19 Locking Functions
| Name | Description |
|---|---|
GET_LOCK() | 이름이 있는 lock 가져오기 |
IS_FREE_LOCK() | 이름이 있는 lock이 사용 가능한지 여부 |
IS_USED_LOCK() | 이름이 있는 lock이 사용 중인지 여부; true인 경우 커넥션 식별자 반환 |
RELEASE_ALL_LOCKS() | 현재의 모든 이름 있는 lock 해제 |
RELEASE_LOCK() | 이름 있는 lock 해제 |
문자열 _str_로 주어진 이름을 가진 lock을 timeout 초의 timeout을 사용하여 얻으려고 시도합니다. 음수 timeout 값은 무한 timeout을 의미합니다. lock은 배타적입니다. 하나의 세션이 보유하는 동안, 다른 세션들은 동일한 이름의 lock을 얻을 수 없습니다.
lock을 성공적으로 얻으면 1을 반환하고, 시도가 timeout되면(예를 들어, 다른 클라이언트가 이미 그 이름을 lock한 경우) 0을 반환하며, 오류가 발생하면(메모리 부족이거나 스레드가 mysqladmin kill로 kill된 경우 등) NULL을 반환합니다.
GET_LOCK()으로 획득한 lock은 RELEASE_LOCK()을 실행하여 명시적으로 해제하거나, 세션이 종료될 때(정상 또는 비정상 종료 모두) 암묵적으로 해제됩니다. GET_LOCK()으로 획득한 lock은 트랜잭션이 커밋되거나 롤백될 때 해제되지 않습니다.
GET_LOCK()은 메타데이터 잠금(MDL) 서브시스템을 사용하여 구현됩니다. 여러 개의 lock을 동시에 획득할 수 있으며, GET_LOCK()은 기존 lock을 해제하지 않습니다. 예를 들어, 다음과 같은 statement를 실행한다고 가정해 봅시다:
1SELECT GET_LOCK('lock1',10); 2SELECT GET_LOCK('lock2',10); 3SELECT RELEASE_LOCK('lock2'); 4SELECT RELEASE_LOCK('lock1');
두 번째 GET_LOCK()은 두 번째 lock을 획득하고, 두 개의 RELEASE_LOCK() 호출은 모두 1(success)을 반환합니다.
하나의 세션이 동일한 이름에 대해 여러 개의 lock을 획득하는 것도 가능합니다. 해당 세션이 그 이름에 대한 자신의 모든 lock을 해제할 때까지, 다른 세션들은 그 이름의 lock을 획득할 수 없습니다.
GET_LOCK()으로 획득한, 고유한 이름을 가진 lock은 Performance Schema의 metadata_locks 테이블에 나타납니다. OBJECT_TYPE 컬럼은 USER LEVEL LOCK이라고 표시되고 OBJECT_NAME 컬럼은 lock 이름을 나타냅니다. 동일한 이름에 대해 여러 개의 lock이 획득되는 경우, 그 이름에 대한 첫 번째 lock만이 metadata_locks 테이블에 row를 등록합니다. 그 이름에 대한 이후의 lock은 lock 내부의 카운터를 증가시키지만, 추가적인 메타데이터 잠금을 획득하지는 않습니다. 해당 이름에 대한 마지막 lock 인스턴스가 해제될 때, 그 lock에 대한 metadata_locks row는 삭제됩니다.
여러 개의 lock을 획득할 수 있는 기능 때문에, 클라이언트들 사이에 교착 상태가 발생할 가능성이 있습니다. 이러한 일이 발생하면, 서버는 호출자 중 하나를 선택하여 그의 lock 획득 요청을 ER_USER_LOCK_DEADLOCK 오류와 함께 종료합니다. 이 오류는 트랜잭션이 롤백되는 원인이 되지 않습니다.
MySQL은 lock 이름의 최대 길이를 64자까지로 제한합니다.
GET_LOCK()은 애플리케이션 잠금을 구현하거나 레코드 잠금을 시뮬레이션하는 데 사용할 수 있습니다. 이름은 서버 전체 범위에서 lock됩니다. 어느 한 세션에서 어떤 이름이 lock되면, 동일한 이름에 대한 lock을 다른 세션이 요청하는 경우 GET_LOCK()은 블록됩니다. 이것은 동일한 lock 이름에 합의한 클라이언트들이 그 이름을 사용해 협조적인 어드바이저리 잠금을 수행할 수 있게 해줍니다. 그러나, 협조하는 클라이언트 집합에 속하지 않은 클라이언트가 의도치 않게 또는 의도적으로 그 이름을 lock하여, 협조하는 어떤 클라이언트도 그 이름을 lock할 수 없게 만들 수 있다는 점에 주의해야 합니다. 이 가능성을 줄이는 한 가지 방법은 데이터베이스 전용 또는 애플리케이션 전용인 lock 이름을 사용하는 것입니다. 예를 들어, db_name.str 또는 app_name.str 형태의 lock 이름을 사용합니다.
여러 클라이언트가 동일한 lock을 기다리고 있는 경우, lock을 획득하는 순서는 정의되어 있지 않습니다. 애플리케이션은 클라이언트들이 lock 요청을 발행한 순서와 동일한 순서로 lock을 획득한다고 가정해서는 안 됩니다.
GET_LOCK()은 statement 기반 복제에 대해 안전하지 않습니다. binlog_format이 STATEMENT로 설정된 상태에서 이 function을 사용하면 경고가 로그에 기록됩니다.
GET_LOCK()은 단일 mysqld에 대해서만 lock을 설정하므로, 여러 MySQL 서버에 걸쳐 SQL 잠금을 강제할 방법이 없는 NDB Cluster와 함께 사용하기에는 적합하지 않습니다. 자세한 내용은 Section 25.2.7.10, “Limitations Relating to Multiple NDB Cluster Nodes”를 참조하십시오.
주의
여러 개의 이름 있는 lock을 획득할 수 있는 기능으로 인해, 단일 statement가 매우 많은 수의 lock을 획득할 수 있습니다. 예를 들어:
1INSERT INTO ... SELECT GET_LOCK(t1.col_name) FROM t1;
이러한 유형의 statement는 특정한 부정적인 영향을 줄 수 있습니다. 예를 들어, statement가 중간에 실패하여 롤백되는 경우에도, 실패 시점까지 획득된 lock은 여전히 존재합니다. 삽입된 row와 획득된 lock 사이에 대응 관계가 있어야 한다는 의도가 있다면, 그 의도는 충족되지 않습니다. 또한, lock이 특정 순서로 부여되는 것이 중요하다면, 옵티마이저가 어떤 실행 계획을 선택하느냐에 따라 결과 집합의 순서가 달라질 수 있다는 점에 유의해야 합니다. 이러한 이유로, 애플리케이션을 statement당 하나의 lock 획득 호출만 수행하도록 제한하는 것이 가장 좋을 수 있습니다.
다른 locking 인터페이스가 플러그인 서비스 또는 로더블 함수 집합 중 하나로 제공됩니다. 이 인터페이스는 GET_LOCK() 및 관련 function이 제공하는 인터페이스와 달리, lock 네임스페이스와 서로 구분되는 읽기 잠금과 쓰기 잠금을 제공합니다. 자세한 내용은 Section 7.6.8.1, “The Locking Service”를 참조하십시오.
_str_이라는 이름을 가진 lock이 사용 가능한지(즉, 잠겨 있지 않은지) 확인합니다. lock이 free(아무도 그 lock을 사용하지 않음)인 경우 1을 반환하고, lock이 사용 중이면 0을 반환하며, 잘못된 인수 같은 오류가 발생하면 NULL을 반환합니다.
이 function은 statement 기반 복제에 대해 안전하지 않습니다. binlog_format이 STATEMENT로 설정된 상태에서 이 function을 사용하면 경고가 로그에 기록됩니다.
_str_이라는 이름을 가진 lock이 사용 중인지(즉, 잠겨 있는지) 확인합니다. 사용 중인 경우, lock을 보유하고 있는 클라이언트 세션의 커넥션 식별자를 반환합니다. 그렇지 않으면 NULL을 반환합니다.
이 function은 statement 기반 복제에 대해 안전하지 않습니다. binlog_format이 STATEMENT로 설정된 상태에서 이 function을 사용하면 경고가 로그에 기록됩니다.
현재 세션이 보유하고 있는 모든 이름 있는 lock을 해제하고, 해제된 lock의 개수를 반환합니다(없으면 0).
이 function은 statement 기반 복제에 대해 안전하지 않습니다. binlog_format이 STATEMENT로 설정된 상태에서 이 function을 사용하면 경고가 로그에 기록됩니다.
문자열 _str_로 지정된 이름을 가진 lock을 GET_LOCK()으로 획득한 경우 해제합니다. lock이 해제되면 1을 반환하고, 이 스레드가 해당 lock을 설정하지 않은 경우(lock은 해제되지 않음) 0을 반환하며, 이름 있는 lock이 존재하지 않으면 NULL을 반환합니다. lock이 존재하지 않는 경우는, 해당 lock이 GET_LOCK() 호출로 한 번도 획득되지 않았거나, 이전에 해제된 경우입니다.
RELEASE_LOCK()과 함께 사용하기에 DO statement가 편리합니다. Section 15.2.3, “DO Statement”를 참조하십시오.
이 function은 statement 기반 복제에 대해 안전하지 않습니다. binlog_format이 STATEMENT로 설정된 상태에서 이 function을 사용하면 경고가 로그에 기록됩니다.
14.13 Encryption and Compression Functions
14.15 Information Functions