트랜잭션 & 잠금 완전 정복 — CI4에서 Savepoint · FOR UPDATE · NOWAIT
📋 실습 안내
✏️ CODE EDITOR (JSX)
▶ 실행 버튼을 눌러 코드를 테스트하세요.
👁️ 내 미리보기
내 코드 실행 결과
🎯 완성 미리보기
목표
위 에디터 코드를 수정해서 이 결과물과 똑같이 만들어보세요!
💡 TODO 주석을 채워서 위 결과물처럼 동작하게 만들어보세요
🤖 AI 선생님에게 질문하기
이번 강의 전용
▼
선생님이 답변 중이에요...
⚠️ 학습 관련 질문만 답변합니다. 관련 없는 질문은 자동으로 학습으로 유도됩니다.
Q1. PostgreSQL의 기본 트랜잭션 격리 수준은?
💡 PostgreSQL의 기본 격리 수준은 READ COMMITTED입니다. MySQL의 기본값(REPEATABLE READ)과 다릅니다. READ COMMITTED는 커밋된 데이터만 읽을 수 있어 Dirty Read를 방지하지만, 같은 트랜잭션 내에서 동일 행을 두 번 읽으면 다른 결과가 나올 수 있습니다.
Q2. PostgreSQL Savepoint의 올바른 사용 순서는?
💡 Savepoint는 트랜잭션 내에서 중간 지점을 저장합니다. 성공 시 RELEASE SAVEPOINT로 해제하고, 실패 시 ROLLBACK TO SAVEPOINT로 해당 지점까지만 롤백합니다. 반드시 명시적 트랜잭션(BEGIN/transBegin) 내에서 사용해야 합니다.
Q3. 여러 워커가 동시에 작업 큐에서 중복 없이 작업을 가져가려면?
💡 FOR UPDATE SKIP LOCKED는 다른 트랜잭션이 잠근 행을 건너뛰고 잠금 가능한 다음 행을 선택합니다. 작업 큐(Job Queue) 패턴에서 여러 워커가 중복 없이 작업을 처리할 때 가장 적합한 잠금 방식입니다. FOR UPDATE만 사용하면 다른 워커가 잠금 해제를 기다려 순차 처리가 됩니다.
Q4. 데드락(Deadlock) 방지를 위한 가장 효과적인 패턴은?
💡 데드락은 두 트랜잭션이 서로 상대방이 보유한 잠금을 기다릴 때 발생합니다. 모든 트랜잭션에서 항상 동일한 순서(예: ID 오름차순)로 잠금을 획득하면 순환 대기가 발생하지 않아 데드락을 원천적으로 방지할 수 있습니다.
Q5. 낙관적 잠금(Optimistic Locking)의 핵심 원리는?
💡 낙관적 잠금은 실제 데이터베이스 잠금을 사용하지 않습니다. 데이터를 읽을 때 version 값을 함께 가져오고, 저장 시 WHERE version = 읽은버전 조건을 추가합니다. 다른 사용자가 그 사이 수정했다면 affectedRows가 0이 되어 충돌을 감지합니다.
😅
아쉽네요!
점수: 0점 — 70점 이상이 되어야 통과합니다.