동시성 — 두 사람이 같은 행을 건드릴 때 · 잠금과 데드락 · 퀴즈
동시성 확인
문항 8개. 정답과 해설은 풀어 본 뒤에 보여 드립니다.
재고가 음수가 되는 '잃어버린 갱신' 의 원인은?
- UPDATE 문의 SQL 문법이 틀려서
- 재고 컬럼에 인덱스가 없어서
- 읽고 판단하고 쓰는 사이에 남이 끼어들 수 있어서
- 트랜잭션을 커밋하지 않아서
가능하다면 가장 싼 해법은?
- select ... for update
- 한 문장으로 끝내기(update ... where qty > 0)
- 테이블 잠금
- 직렬화 격리 수준
데드락을 대부분 없애는 규칙은?
- 잠그는 순서를 모두가 같게 한다
- 트랜잭션을 길게 잡는다
- 격리 수준을 낮춘다
- 인덱스를 추가한다
`lock_timeout` 을 안 걸면 결국 어디가 먼저 멈추나?
- 데이터베이스가 먼저 멈춘다
- 디스크가 먼저 가득 찬다
- 네트워크 대역이 먼저 막힌다
- 커넥션 풀이 차서 애플리케이션이 멈춘다
`for update skip locked` 가 바꾸는 것은?
- 잠금을 안 건다
- 잠긴 행을 기다리지 않고 건너뛴다
- 커밋을 자동으로 한다
- 격리 수준을 올린다
트랜잭션 안에서 외부 API 를 부르면 안 되는 이유는?
- 트랜잭션 안에서는 문법상 안 된다
- 외부 호출이 있으면 커밋이 안 된다
- 잡은 잠금이 그 시간만큼 유지된다
- 응답이 느려지기 때문에
어드바이저리 잠금에서 주의할 점은?
- 일반 잠금보다 느리다
- 반드시 트랜잭션 안에서만 쓸 수 있다
- 대상 테이블에 인덱스가 있어야 한다
- 키 공간이 전역이고 세션에 묶여 커넥션 반납 전에 풀어야 한다
차단 관계를 한 줄로 보는 방법은?
- pg_stat_activity 에서 pg_blocking_pids(pid) 를 본다
- pg_locks 를 자기 자신과 직접 조인해서 본다
- 잠금 대기 로그를 켜고 기다린다
- 막힌 질의에 EXPLAIN 을 걸어 본다