-
쓰기락 for update 사용시 주의점 (mysql,postgresql)데이터베이스 2024. 7. 11. 09:49728x90반응형
FOR UPDATE를 사용할 때 조건절에 인덱스가 있다면 인덱스를 사용하여 조건에 맞는 행들을 찾고 그 행들에 대해 잠금을 겁니다. 따라서, 인덱스 스캔 조건에 맞는 모든 행에 잠금이 걸립니다. 이는 결과 집합의 크기와 상관없이 조건에 맞는 모든 행이 잠금이 걸리는 것을 의미합니다.
MySQL 예시
예를 들어, 다음과 같은 쿼리가 있다고 가정해봅시다:
SELECT * FROM your_table WHERE indexed_column = some_value AND another_column = another_value FOR UPDATE;
여기서 indexed_column에 인덱스가 있고, another_column에는 인덱스가 없다고 가정합니다.
- 인덱스가 있는 indexed_column을 사용하여 먼저 조건을 만족하는 행을 찾습니다.
- 이 행들 중에서 another_column = another_value 조건을 추가로 필터링합니다.
- FOR UPDATE는 인덱스 조건을 만족하는 모든 행에 대해 잠금을 겁니다.
즉, indexed_column = some_value 조건을 만족하는 행이 4개라면, 이 4개 행 모두에 잠금이 걸립니다. 비록 최종 결과 집합이 필터링 후 2개일지라도, 인덱스 조건을 만족하는 4개 행 모두에 대해 잠금이 걸리는 것입니다.
PostgreSQL에서의 동작
PostgreSQL에서도 비슷하게 동작합니다. 조건절에 인덱스가 있다면, 인덱스를 사용하여 조건을 만족하는 행을 찾고, 그 행들에 대해 행 수준 잠금을 겁니다. 따라서, MySQL과 동일한 논리가 적용됩니다.
예를 들어, PostgreSQL에서 다음과 같은 쿼리를 사용할 수 있습니다:
BEGIN; SELECT * FROM your_table WHERE indexed_column = some_value AND another_column = another_value FOR UPDATE; -- 다른 쿼리들 또는 업데이트 COMMIT;
이 쿼리에서도 indexed_column에 인덱스가 있다고 가정하면, indexed_column = some_value 조건을 만족하는 모든 행에 잠금이 걸리고, 그 후 another_column = another_value 조건이 추가로 적용되어 최종 결과가 반환됩니다.
요약
- MySQL: FOR UPDATE는 인덱스 조건을 만족하는 모든 행에 잠금을 겁니다. 최종 결과 집합이 필터 조건으로 인해 작더라도, 인덱스 조건을 만족하는 행은 모두 잠금이 걸립니다.
- PostgreSQL: FOR UPDATE는 MySQL과 유사하게 동작합니다. 인덱스 조건을 만족하는 모든 행에 잠금을 걸고, 그 후 추가 필터 조건이 적용됩니다.
따라서, MySQL과 PostgreSQL 모두 인덱스 스캔 조건에 맞는 모든 행에 대해 잠금을 겁니다. 최종 결과 집합의 크기는 추가 필터 조건에 의해 결정됩니다.
728x90반응형'데이터베이스' 카테고리의 다른 글
상관 서브쿼리 (Correlated Subquery)란? 종류들 (0) 2024.10.22 NL조인시 드라이빙테이블 100개 드리븐 1000개, 드라이빙테이블1000개 드리븐 100개가 성능 차이가 나는이유 (1) 2024.10.21 [SQL] GROUP BY와 PARTITION BY의 차이점 (0) 2024.10.14