`SELECT FOR UPDATE`는 SQL에서 행 단위 잠금 메커니즘으로, 트랜잭션에서 검색된 행을 잠그고 다른 트랜잭션이 해당 행을 수정하거나 잠그는 것을 방지합니다. 데이터 일관성을 유지하기 위한 목적으로 사용되며, 데이터 무결성을 유지해야 하는 경우에 자주 사용됩니다. MySQL에서 `SELECT FOR UPDATE`의 구현은 InnoDB와 같이 행 잠금을 사용하는 저장 엔진과 밀접하게 연관되어 있습니다. 이 잠금 메커니즘은 쿼리에 의해 검색된 행에 배타적 잠금을 설정하여 다른 트랜잭션이 해당 행을 수정하거나 공유 잠금 또는 배타적 잠금을 설정하는 것을 방지합니다. `SELECT FOR UPDATE`는 트랜잭션 내에서 사용해야 하며, 트랜잭션을 지원하는 저장 엔진을 사용할 때에만 효과적입니다. 대상 행이 이미 다른 트랜잭션에 의해 잠겨 있는 경우, 현재 트랜잭션은 잠금이 해제될 때까지 또는 시간 초과가 발생할 때까지 대기 상태가 됩니다. InnoDB 저장 엔진은 인덱스를 통해 행 단위 잠금을 구현하며, `SELECT FOR UPDATE`는 쿼리 조건을 충족하는 모든 행을 잠급니다. 잠금 프로세스는 스캔된 각 행에 배타적 잠금을 설정하는 것을 포함하며, 행이 이미 다른 트랜잭션에 의해 잠겨 있는 경우 현재 트랜잭션은 해당 잠금이 해제될 때까지 기다립니다. 인덱스 사용은 `SELECT FOR UPDATE`를 최적화하는 데 매우 중요합니다. 인덱스를 사용하는 쿼리는 행 단위 잠금을 적용하여 테이블 단위 잠금으로 인한 성능 저하를 방지합니다.
dev.to
The Mechanics of SELECT FOR UPDATE in SQL
