[sql] Phantom Read 현상
SQL에서 Phantom Read는 트랜잭션이 같은 쿼리를 두 번 실행할 때, 두 번의 실행 간에 다른 트랜잭션이 중간에 레코드를 추가, 삭제 또는 수정함으로써 발생하는 현상을 말합니다. 이러한 동작은 격리 수준의 설정에 따라 달라질 수 있습니다.
Phantom Read는 트랜잭션 격리 수준 중 하나인 Repeatable Read 에서 발생할 수 있습니다. 이 격리 수준에서 하나의 트랜잭션이 특정 범위의 레코드를 읽은 후, 다른 트랜잭션이 해당 범위에 새로운 레코드를 추가하거나 기존의 레코드를 제거할 경우, 첫 번째 트랜잭션은 해당 범위에 대해 두 번 실행할 때 두 번의 결과가 다를 수 있습니다.
Phantom Read 예시
다음과 같은 SQL 쿼리를 실행한다고 가정해보겠습니다.
START TRANSACTION;
SELECT * FROM products WHERE category = 'Electronics';
-- 뒤이어 다른 트랜잭션이 새로운 레코드를 추가함
SELECT * FROM products WHERE category = 'Electronics';
COMMIT;
위의 예시에서 두 번의 SELECT
쿼리 사이에 다른 트랜잭션이 Electronics 카테고리에 새로운 제품을 추가했다면, 첫 번째와 두 번째 SELECT
쿼리의 결과는 다를 수 있습니다. 이것이 Phantom Read 현상의 전형적인 예시입니다.
Phantom Read는 데이터 일관성을 해치는 현상이기 때문에 방지하기 위해서는 트랜잭션 격리 수준을 잘 선택하고, 필요한 경우 락을 이용하여 다른 트랜잭션으로부터 데이터를 보호하는 것이 중요합니다.
결론
SQL에서의 Phantom Read는 격리 수준과 다른 트랜잭션들과의 상호작용에 따라 발생하는 현상으로, 이를 이해하고 적절히 대응하는 것이 데이터 일관성과 안정성을 유지하는 데 중요합니다.
참고 자료:
- MySQL 공식 문서: https://dev.mysql.com/doc/refman/8.0/en/innodb-phantom-reads.html
- PostgreSQL 공식 문서: https://www.postgresql.org/docs/9.5/transaction-iso.html