- 카테고리:
FOR UPDATE¶
쿼리가 포함된 트랜잭션이 커밋되거나 중단될 때까지 쿼리가 선택하는 행을 잠급니다.
이 절은 하이브리드 테이블에서만 사용하도록 지원되며 여러 트랜잭션이 동시에 동일한 행에 액세스를 시도하는 트랜잭션 워크로드에 유용합니다. 잠금을 수행하는 트랜잭션이 완전히 커밋되거나 롤백될 때까지 다른 트랜잭션이 이 행에 데이터를 쓸 수 없도록 하기 위해 행은 업데이트를 위해 잠깁니다. 그러나 다른 트랜잭션이 잠긴 행을 읽을 수 있으며, 동일 테이블의 다른 행을 읽거나, 업데이트하거나, 삭제할 수 있습니다.
SELECT ...
FROM ...
[ ... ]
FOR UPDATE [ NOWAIT | WAIT <wait_time> ]
매개 변수¶
NOWAIT
트랜잭션이 선택한 행을 즉시 잠글 수 없는 경우 오류를 반환합니다. NOWAIT가 기본값입니다.
WAIT wait_time
쿼리가 행 수준 잠금을 획득하기 위해 기다리는 최대 시간(초)을 지정합니다. 대기 시간이 만료되면 쿼리는 오류를 반환합니다.
제한 사항¶
FOR UPDATE 절:
사용법 노트¶
하이브리드 테이블은 READ COMMITTED 격리 수준을 지원하므로 FOR UPDATE 절은 읽기 안정성을 보장하지 않습니다. 예를 들어, 이름이 ID
인 단일 열이 있는 테이블 T
에 값이 5
및 10
인 두 개의 행이 있다고 가정합니다.
다음 쿼리는 트랜잭션
T1
에서 실행됩니다.SELECT * FROM T WHERE ID < 20 FOR UPDATE;
쿼리는
5
및10
값을 반환하고 이러한 두 행을 잠급니다.또 다른 트랜잭션
T2
는 다음 DELETE 작업을 실행합니다.DELETE FROM T WHERE ID = 5;
트랜잭션
T2
는T1
이 완료될 때까지(즉, 커밋하거나 롤백할 때까지) 기다려야 합니다.그러나 세 번째 트랜잭션인
T3
는 다음 INSERT 작업을 완료할 수 있습니다.INSERT INTO T VALUES 12;
이제
T1
의 후속 쿼리는 두 개가 아닌 세 개의 값(행)인5
,10
,12
를 반환합니다.SELECT * FROM T WHERE ID < 20;
예¶
새 트랜잭션을 열고 하이브리드 테이블(ht
)에서 모든 행을 선택한 다음 트랜잭션이 커밋될 때까지 해당 행을 잠급니다. 트랜잭션을 커밋하기 전에 선택한 일부 행을 업데이트하고 다른 쿼리를 실행합니다.
BEGIN;
...
SELECT * FROM ht ORDER BY c1 FOR UPDATE;
...
UPDATE ht set c1 = c1 + 10 WHERE c1 = 0;
...
SELECT ... ;
...
COMMIT;
행 잠금에 대해 최대 60초의 대기 시간을 적용합니다.
BEGIN;
...
SELECT * FROM ht FOR UPDATE WAIT 60;
...
COMMIT;