트랜잭션은 정합성의 단위야
웹 요청의 데이터베이스 변경은 함께 확정되어야 하는 범위만 한 트랜잭션으로 묶어. 오래 열린 트랜잭션은 잠금을 붙잡고 죽은 행 버전을 쌓으며 VACUUM을 방해해.
운영 장애를 막는 5가지 규칙
- 가능한 늦게 열고 빨리 확정해. 열린 동안 외부 HTTP 호출을 하지 마.
- 사용자가 폼을 채우는 동안 트랜잭션을 잡아 두지 마.
- 구체적인 이유가 없다면 READ COMMITTED에서 시작해.
- REPEATABLE READ나 SERIALIZABLE에서는 직렬화 실패를 backoff와 함께 재시도해.
- 여러 왕복에 걸친
SELECT FOR UPDATE를 피하고 가능하면 한 문장이나 저장 프로시저로 줄여.
프레임워크의 경계 도구를 써
요청을 트랜잭션으로 감싸는 공식 방식을 이용하고, 직접 만든 BEGIN/COMMIT 경로가 연결을 누수하지 않는지 확인해. 이메일과 업로드 같은 외부 작업은 트랜잭션을 열기 전이나 확정한 뒤에 실행해.