MySQL 에서 Application lock 걸기
1) Application lock 걸기
SELECT GET_LOCK('lock_name',10);
> 'lock_name' 이라는 이름의 application lock을 건다.
> (이미 lock 이 걸려 있으면) 10 초간 대기 한다.
> 반환값
1 : lock 성공
0 : lock 실패, timeout
NULL : lock 실패, 장애 발생
2) lock 해제 (release) 조건
조건1) RELEASE_LOCK() 실행시 :
예) SELECT RELEASE_LOCK('lock_name');
> 반환값
1 : release 성공
0 : release 실패 (현재 쓰레드에서 lock 이 해제되지 않음)
NULL : release 실패 ('lock_name' 는 이름의 lock 이 존재하지 않음.)
조건2) 새로운 GET_LOCK() 실행시 :
예) SELECT GET_LOCK('new_lock_name');
조건3) 연결 종료시
3) lock 확인
SELECT IS_FREE_LOCK('lock_name');
--> 'lock_name' 이라는 이름의 lock 이 사용중이면 (not free 이면) 0 반환,
사용중이 아니면 ( free 이면 ) 1 반환
--> NULL : 'lock_name' 는 이름의 lock 이 존재하지 않음.
SELECT IS_USED_LOCK('lock_name');
--> 'lock_name' 이라는 이름의 lock 이 사용중이면 (used 이면) 1 반환,
사용중이 아니면 (not used 이면 ) 0 반환
--> NULL : 'lock_name' 는 이름의 lock 이 존재하지 않음.
4) 특이사항
> 트랜젹션과 함께 사용될 때, 트랜젹션이 종료(commit / rollback) 되더라도, lock 이 해제되지는 않는다.
반드시 명시적으로 lock을 해제 해야 한다.
Locks obtained with GET_LOCK() do not interact with transactions. That is, committing a transaction does not release any such locks obtained during the transaction.
[참조: Miscellaneous Functions]