카테고리 없음

MySQL 에서 Application lock 걸기

좋은나무 2013. 1. 14. 12:16

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]