PostgreSQL - Locks: A Beginner's Guide

안녕하세요, 미래의 데이터베이스 마법사 여러분! 오늘 우리는 PostgreSQL의 락(lcks) 세계에 흥미로운 여정을 떠납니다. 코드를 한 줄도 작성해 본 적이 없다면 걱정하지 마세요 - 저는 당신의 친절한 안내자가 되어 이 모험을 함께할 것이며, 저의 연수 경험을 바탕으로 당신이 모든 단계를 이해할 수 있도록 도와드리겠습니다.

PostgreSQL - Locks

락이란 무엇인가요?

이제 자세한 내용으로 들어가기 전에 간단한 비유를 시작해보겠습니다. 당신이 도서관에 있고, 책을 빌리고 싶어한다고 상상해봅시다. 책을的书 架에서 꺼내고, 당신이 읽는 동안 다른 사람이 그 책을 빌릴 수 없습니다. 데이터베이스에서 락은 이와 같은 역할을 합니다 - 여러 사용자가 동시에 같은 데이터를 수정하는 것을 방지하여 혼란과 오류를 피하게 합니다.

PostgreSQL에서의 락 유형

PostgreSQL은 데이터에 대한 동시 접근을 관리하기 위해 여러 종류의 락을 사용합니다. 다음은 주요 유형을 요약한 표입니다:

락 유형 설명
행 레벨 락 동시에 수정되지 않도록 개별 행을 보호
테이블 레벨 락 특정 연산을 통해 전체 테이블을 보호
자문 락 응용 프로그램 특정 목적을 위한 사용자 정의 락

이제 이들 락을 더 자세히 탐구해보겠습니다!

행 레벨 락

행 레벨 락은 가장 일반적인 유형입니다. 테이블의 데이터를 수정할 때 자동으로 적용됩니다.

BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
-- id = 1인 행이 이제 락이 걸렸습니다
COMMIT;

이 예제에서, 계정 1의 잔액을 업데이트할 때 PostgreSQL이 자동으로 그 행을 락합니다. 다른 트랜잭션이 커밋하기 전에 같은 행을 수정하려고 시도하면 기다려야 합니다.

테이블 레벨 락

테이블 레벨 락은 전체 테이블을 보호합니다. 덜 일반적이지만, 전체 테이블에 영향을 미치는 연산을 수행할 때 필요할 수 있습니다.

BEGIN;
LOCK TABLE accounts IN EXCLUSIVE MODE;
-- accounts 테이블 전체가 이제 락이 걸렸습니다
UPDATE accounts SET interest_rate = interest_rate + 0.01;
COMMIT;

이 코드는 전체 accounts 테이블을 락하고 모든 행을 업데이트합니다. 이는 하나의 책장에 "방해 금지" 표지를 걸어 두는 것과 같습니다!

데드락

이제 조금 더 복잡한 개념인 데드락에 대해 이야기해보겠습니다. 두 사람이 각각 다른 사람이 필요로 하는 책을 들고 있는 상황을 상상해봅시다. 누구도 다른 책을 얻지 못할 때까지 읽을 수 없으며, 누구도 현재 책을 내주지 않습니다. 이는 데드락입니다!

PostgreSQL에서 데드락은 두 트랜잭션이 상호적으로 락을 기다리는 경우에 발생할 수 있습니다. 다음은 예제입니다:

-- 트랜잭션 1
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;

-- 트랜잭션 2 (동시에 실행 중)
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 2;
UPDATE accounts SET balance = balance + 100 WHERE id = 1;

이 트랜잭션이 동시에 실행되면 데드락이 발생할 수 있습니다: 트랜잭션 1은 계정 1에 락을 걸고 계정 2를 기다리며, 트랜잭션 2는 계정 2에 락을 걸고 계정 1을 기다립니다.

幸運히도, PostgreSQL은 데드락을 감지하고 자동으로 하나의 트랜잭션을 취소하여 상황을 해결할 수 있습니다. 이는 도서관에서 책 교환 문제를 해결하는 도서관 사서와 같습니다!

자문 락

마지막으로 자문 락에 대해 이야기해보겠습니다. 이 락은 특별한 점이 있습니다. 당신, 개발자가 언제 사용할지 결정할 수 있습니다. 이는 도서관에서 자신만의 "방해 금지" 표지를 만드는 것과 같습니다!

자문 락을 사용하는 예제는 다음과 같습니다:

-- 자문 락 획득
SELECT pg_advisory_lock(123);

-- 여기서 일부 작업 수행...

-- 락 해제
SELECT pg_advisory_unlock(123);

이 예제에서, 123은 당신이 선택한 임의의 숫자로, 락을 식별합니다. 동일한 숫자로 락을 획득하려는 다른 프로세스는 당신이 해제할 때까지 기다려야 합니다.

자문 락은 특정 데이터베이스 객체에 연동되지 않은 응용 프로그램의 활동을 조정하는 데 유용합니다. 예를 들어, 배치 작업이 동시에 하나만 실행되도록 보장하는 데 사용할 수 있습니다.

결론

이제 여러분은 PostgreSQL의 락 세계를 여행한 것입니다. 일반적인 행 레벨 락에서 데드락과 사용자 정의 가능한 자문 락에 이르기까지 다양한 내용을 배웠습니다. 기억하시기 바랍니다, 락은 데이터베이스의 교통 신호와 같아 - 모든 것이 원활하게 작동하고 충돌을 방지하는 데 도움이 됩니다.

PostgreSQL 여정을 계속하면서 락과 관련된 더 복잡한 상황을 마주하게 될 것입니다. 그러나 걱정하지 마세요 - 이 기초를 바탕으로 그 도전 과제를 해결할 준비가 되어 있습니다. 계속 연습하고, 호기심을 가지고, 행복하게 코딩하세요!

Credits: Image by storyset