위키득계정 ↗
기술

데이터베이스 트랜잭션

데이터베이스 트랜잭션기술
영문명
Database transaction
결과 확정
커밋
변경 취소
롤백
핵심 고려
원자성, 일관성, 격리성, 지속성
데이터베이스 트랜잭션은 여러 읽기와 변경을 하나의 처리 단위로 다루는 기능이다. 작업 결과를 확정하거나 취소할 수 있게 하고, 동시 접근과 장애 상황에서 데이터의 일관성을 유지하도록 돕는다.

함께 바뀌어야 하는 기록

도서 대출을 등록하면서 책의 상태도 대출 중으로 바꾼다고 하자. 대출 기록만 저장되고 책은 계속 대출 가능으로 남으면 두 기록이 어긋난다. 트랜잭션을 이용하면 함께 성공해야 하는 변경들을 묶을 수 있다.

프로그램이 작업을 마쳤다고 판단하면 커밋으로 결과를 확정한다. 도중에 실패했다면 롤백으로 변경을 취소한다. 구체적인 경계와 명령은 데이터베이스와 접속 도구에 따라 다르며, 한 문장씩 자동으로 확정하는 방식도 있다.

ACID가 설명하는 성질

원자성은 일부 변경만 남지 않도록 작업 단위를 다루는 성질이다. 일관성은 정의된 제약과 규칙을 만족하는 상태 사이에서 처리가 이루어지도록 하는 것과 관련된다. 데이터베이스가 알지 못하는 업무 규칙까지 저절로 검증해 주는 것은 아니다.

격리성은 동시에 진행되는 작업들이 서로의 읽기와 변경을 어떻게 관찰하는지에 관한 성질이다. 지속성은 확정된 결과를 장애 후에도 보존하는 것과 관련된다. 실제 보장 범위에는 시스템의 설정과 저장 장치의 동작도 영향을 준다.

동시 실행은 별도의 문제

작업을 트랜잭션으로 묶었다고 모든 동시성 문제가 사라지는 것은 아니다. 둘이 같은 수량을 읽고 각각 갱신하면 의도하지 않은 결과가 생길 수 있다. 격리 수준, 잠금, 조건부 갱신, 제약 조건 등을 상황에 맞게 사용해야 한다.

격리를 강하게 하면 충돌한 작업이 취소되거나 다시 실행해야 할 수 있다. 재시도는 처리 전체의 의미를 고려해야 한다. 데이터베이스 밖으로 보낸 알림이나 외부 서비스 호출이 함께 취소되는 것은 아니므로 중복 실행도 따로 다뤄야 한다.

짧고 분명한 경계

사용자의 입력을 오래 기다리거나 느린 외부 통신을 수행한 채 트랜잭션을 유지하면 자원 점유와 충돌이 늘어날 수 있다. 함께 확정할 변경을 분명하게 정하고 실패했을 때의 복구 경로를 설계하는 것이 중요하다.

관련 문서

데이터베이스 / 관계형 데이터베이스 / SQL / 교착 상태