DB/MYSQL

SELECT FOR UPDATE

MAKGA 2022. 10. 20. 11:06
320x100

일반적인 SELECT만 하게 되면 Shared lock 이 걸리므로 여러 세션에서 동시에 데이터에 접근이 가능하게 된다.

Commit 쿼리를 실행하기 전까지 데이터가 변경되지 않으므로, 다른 세션에서 데이터 변경 작업(Update, Delete)이 있는 경우 데이터의 일관성이 깨지게 된다.

 

대신에 SELECT ~ FOR UPDATE 를 사용하게 되면 반환된 ROW에 대해 row level lock을 걸 수 있다.

다른 세션에서 Select은 가능하나, Update나 Delete 쿼리에 대해 단일 수행과 일관성을 보장하므로 변경할 수 없다.

 

 

-- SELECT 할 때 LOCK을 제어할 수 없으면 무한정으로 기다린다.
SELECT c FROM t WHERE key = 1 FOR UPDATE;

-- SELECT 할 때 LOCK을 제어할 수 없으면 에러처리 한다.
SELECT c FROM t WHERE key = 1 FOR UPDATE NOWAIT;

-- SELECT 할 때 LOCK을 제어할 수 없으면 5초 동안 재시도 후 에러처리 한다.
SELECT c FROM t WHERE key = 1 FOR UPDATE WAIT 5;

 

320x100