[sql] 쿼리 잠금 및 데드락 처리
데이터베이스 시스템에서 두 개 이상의 트랜잭션이 서로 다른 순서로 데이터에 접근하고 수정하려고 할 때 잠금과 데드락 문제가 발생할 수 있습니다. 이러한 문제를 해결하기 위해 SQL에서는 다양한 기능을 제공합니다.
1. 쿼리 잠금 처리
1.1 테이블 락
데이터베이스에서 테이블 락은 한 트랜잭션이 특정 테이블을 읽거나 수정할 때 다른 트랜잭션이 해당 테이블에 잠금을 설정하여 접근을 제한하는 메커니즘입니다. 이를 통해 데이터 일관성을 유지하고 경쟁 조건을 방지할 수 있습니다.
-- 테이블 락 설정
LOCK TABLE table_name IN SHARE MODE;
1.2 로우 레벨 락
로우 레벨 락은 테이블 전체가 아닌 개별 로우에 대한 잠금을 설정합니다. 이는 다수의 트랜잭션이 동시에 동일한 테이블의 다른 로우를 수정할 때 유용합니다.
-- 로우 레벨 락 설정
SELECT * FROM table_name WHERE column_name = value FOR UPDATE;
2. 데드락 처리
데드락은 두 개 이상의 트랜잭션이 서로 상대방의 잠금을 대기하고 있는 상태로 무한정 대기하는 상황을 말합니다. SQL에서는 데드락을 방지하거나 처리하기 위한 다양한 방법을 제공합니다.
2.1 잠금 타임아웃 설정
트랜잭션에서 잠금을 얻을 때 타임아웃을 설정하여 대기 시간을 제한할 수 있습니다. 이를 통해 데드락 상황을 방지하고 트랜잭션 성능을 향상시킬 수 있습니다.
-- 잠금 대기 타임아웃 설정
SET lock_timeout TO '5s';
2.2 데드락 탐지 및 제거
데이터베이스 시스템은 데드락을 탐지하고 해결하기 위한 기능을 제공합니다. 대부분의 경우, 데이터베이스가 자체적으로 데드락을 탐지하고 데드락 그래프를 분석하여 해당 트랜잭션을 롤백하여 문제를 해결합니다.
참고 자료
- PostgreSQL 문서: https://www.postgresql.org/docs/current/explicit-locking.html
- MySQL 문서: https://dev.mysql.com/doc/refman/8.0/en/innodb-deadlocks.html