데이터베이스 트랜잭션은 여러 읽기와 쓰기를 하나의 논리적인 작업으로 묶는 단위다. 모두 성공했을 때 결과를 확정하고, 중간에 실패하면 해당 변경을 취소할 수 있다. 문서 발행과 발행 이력을 함께 기록하는 것처럼 함께 성립해야 하는 데이터에 유용하다.
커밋과 롤백
PostgreSQL에서는 BEGIN으로 시작하고 COMMIT으로 확정하며 ROLLBACK으로 취소한다. ROLLBACK 명령 별도의 묶음을 만들지 않은 문장도 트랜잭션 안에서 실행된다. 드라이버가 자동으로 시작하거나 확정하는 경우가 있으므로 애플리케이션 설정도 확인해야 한다. PostgreSQL 트랜잭션 문서
발행 작업의 예
위키에서 문서의 상태를 공개로 바꾸고 발행 이력을 저장한다고 가정하자. 첫 변경만 성공하면 공개 문서인데 이력이 없는 불일치가 생긴다. 두 변경을 같은 트랜잭션에 넣으면 함께 확정하거나 취소하는 경계를 만들 수 있다.
| 단계 | 의미 |
|---|---|
| 시작 | 하나의 변경 묶음을 연다 |
| 상태와 이력 저장 | 같은 업무에 필요한 행을 변경한다 |
| 확정 또는 취소 | 전체 결과를 남기거나 되돌린다 |
트랜잭션 바깥의 일
데이터베이스 변경을 취소했다고 이미 보낸 이메일이나 외부 API 요청까지 취소되는 것은 아니다. 따라서 외부 작업과 데이터 저장의 순서를 설계해야 한다. 발행 알림을 즉시 보내기보다 발송할 작업을 함께 기록하고 별도 처리하는 방식을 고려할 수 있다.
동시에 접근하는 요청 사이에서 어떤 값을 볼 수 있는지는 격리 수준과 관련된다. 트랜잭션이 있다는 이유만으로 모든 경쟁 조건이 사라지지는 않는다. 처리 중 사용자 입력을 오래 기다리면 연결과 잠금을 오래 점유할 수 있으므로, 업무 경계는 명확하게 잡고 실행 시간은 짧게 유지하는 편이 좋다.