카테고리:

쿼리 구문

FOR UPDATE

쿼리가 포함된 트랜잭션이 커밋되거나 중단될 때까지 쿼리가 선택하는 행을 잠급니다.

이 절은 하이브리드 테이블에서만 사용하도록 지원되며 여러 트랜잭션이 동시에 동일한 행에 액세스를 시도하는 트랜잭션 워크로드에 유용합니다. 잠금을 수행하는 트랜잭션이 완전히 커밋되거나 롤백될 때까지 다른 트랜잭션이 이 행에 데이터를 쓸 수 없도록 하기 위해 행은 업데이트를 위해 잠깁니다. 그러나 다른 트랜잭션이 잠긴 행을 읽을 수 있으며, 동일 테이블의 다른 행을 읽거나, 업데이트하거나, 삭제할 수 있습니다.

SELECT ...
  FROM ...
  [ ... ]
  FOR UPDATE [ NOWAIT | WAIT <wait_time> ]
Copy

매개 변수

NOWAIT

트랜잭션이 선택한 행을 즉시 잠글 수 없는 경우 오류를 반환합니다. NOWAIT가 기본값입니다.

WAIT wait_time

쿼리가 행 수준 잠금을 획득하기 위해 기다리는 최대 시간(초)을 지정합니다. 대기 시간이 만료되면 쿼리는 오류를 반환합니다.

제한 사항

FOR UPDATE 절:

사용법 노트

하이브리드 테이블은 READ COMMITTED 격리 수준을 지원하므로 FOR UPDATE 절은 읽기 안정성을 보장하지 않습니다. 예를 들어, 이름이 ID 인 단일 열이 있는 테이블 T 에 값이 510 인 두 개의 행이 있다고 가정합니다.

  1. 다음 쿼리는 트랜잭션 T1 에서 실행됩니다.

    SELECT * FROM T WHERE ID < 20 FOR UPDATE;
    
    Copy

    쿼리는 510 값을 반환하고 이러한 두 행을 잠급니다.

  2. 또 다른 트랜잭션 T2 는 다음 DELETE 작업을 실행합니다.

    DELETE FROM T WHERE ID = 5;
    
    Copy

    트랜잭션 T2T1 이 완료될 때까지(즉, 커밋하거나 롤백할 때까지) 기다려야 합니다.

  3. 그러나 세 번째 트랜잭션인 T3 는 다음 INSERT 작업을 완료할 수 있습니다.

    INSERT INTO T VALUES 12;
    
    Copy
  4. 이제 T1 의 후속 쿼리는 두 개가 아닌 세 개의 값(행)인 5, 10, 12 를 반환합니다.

    SELECT * FROM T WHERE ID < 20;
    
    Copy

새 트랜잭션을 열고 하이브리드 테이블(ht)에서 모든 행을 선택한 다음 트랜잭션이 커밋될 때까지 해당 행을 잠급니다. 트랜잭션을 커밋하기 전에 선택한 일부 행을 업데이트하고 다른 쿼리를 실행합니다.

BEGIN;
...
SELECT * FROM ht ORDER BY c1 FOR UPDATE;
...
UPDATE ht set c1 = c1 + 10 WHERE c1 = 0;
...
SELECT ... ;
...
COMMIT;
Copy

행 잠금에 대해 최대 60초의 대기 시간을 적용합니다.

BEGIN;
...
SELECT * FROM ht FOR UPDATE WAIT 60;
...
COMMIT;
Copy