트랜잭션 = 정합성 단위, 속도 단위 아님
모든 HTTP 요청이 보통 DB 작업을 한 트랜잭션에 감쌈. 트랜잭션의 일은 "이거 다 같이 land 또는 안 함" — 성능 feature 아님. Long-running 트랜잭션이 lock 잡고, dead tuple 누적, VACUUM 막고, 모두에게 contention 만듦.
대부분 프로덕션 DB 화재 막는 5 룰
- 트랜잭션 짧게. 가능한 늦게 열고, 가능한 빨리 commit. 열린 트랜잭션 안에서 외부 HTTP 호출 안 함.
- 유저 입력 가로질러 트랜잭션 잡지 마. BEGIN, 유저가 폼 채우길 기다림, COMMIT — 분 단위 row lock 잡음.
- 이유 없으면 READ COMMITTED. 좋은 이유 있어 default.
- REPEATABLE READ 또는 SERIALIZABLE 쓰면 항상 SerializationFailure 처리. Backoff 와 retry.
- 여러 라운드트립 가로질러
SELECT FOR UPDATE회피. Lock-then-think-then-update 해야 하면 stored procedure 한 개 또는 statement 한 개에.
웹 요청 트랜잭션 템플릿
모든 프레임워크가 요청을 트랜잭션에 감싸는 깨끗한 방법 가짐. 사용. Route handler 의 커스텀 BEGIN/COMMIT 이 트랜잭션 누수 일어나는 방법.