Lock
Row-Level Lock
FOR SHARE
SELECT ... FOR SHARE
FOR SHARE는 해당 트랜잭션이 커밋되거나 롤백되기 전까지 SELECT 문의 결과에 해당하는 rows에 쓰기 락을 겁니다. 그 사이 다른 트랜잭션은 해당 rows를 읽는 것만 가능합니다.
FOR UPDATE
SELECT ... FOR UPDATE
FOR UPDATE는 해당 트랜잭션이 커밋되거나 롤백되기 전까지 SELECT 문의 결과에 해당하는 rows에 읽기, 쓰기 락을 겁니다. 그 사이 다른 트랜잭션은 해당 rows에 접근할 수 없습니다.
경고
서브 쿼리의 관련 rows는 잠기지 않기 때문에 서브 쿼리의 관련 rows도 잠기게 하려면 서브 쿼리에도 FOR UPDATE를 사용해야 합니다.
SELECT * FROM t1 WHERE c1 = (SELECT c1 FROM t2 FOR UPDATE) FOR UPDATE;
User-Level Lock
GET_LOCK
SELECT GET_LOCK('<name>', <timeout>);
GET_LOCK은 <name>이라는 네임드 락을 획득하려고 시도합니다. 락은 RELEASE_LOCK을 통해 명시적으로 해제하거나 세션 종료 시 암묵적으로 해제됩니다.
<timeout>: 락을 획득할 수 있을 때까지 대기할 시간(초), 음수인 경우 무한대기- 응답
1: 락 획득 성공0: 타임아웃null: 에러
RELEASE_LOCK
RELEASE_LOCK은 <name>이라는 네임드 락을 해제합니다.
SELECT RELEASE_LOCK('<name>');
- 응답
1: 락 해제 성공0: 락 해제 실패(해당 스레드에서 락을 획득한 것이 아님)null: 해당 락이 존재하지 않음