트랜잭션 관리
트랜잭션 관리
DuckDB는 ACID 데이터베이스 트랜잭션을 지원해요. 트랜잭션은 격리(isolation)를 제공하는데, 즉 트랜잭션에 의해 만들어진 변경 사항은 커밋되기 전까지 동시 트랜잭션에서 보이지 않아요. 트랜잭션은 중단(abort)될 수도 있는데, 그러면 지금까지 만든 변경 사항이 모두 버려집니다.
출처: 문서
본문
문장
DuckDB는 트랜잭션 관리를 위해 다음 문장들을 제공해요.
트랜잭션 시작
트랜잭션을 시작하려면 다음을 실행하세요.
BEGIN TRANSACTION;
트랜잭션 커밋
트랜잭션을 커밋해 다른 트랜잭션에 보이게 하고, 영속 스토리지에 기록할 수 있어요 (DuckDB를 영속 모드로 사용하는 경우). 트랜잭션을 커밋하려면 다음을 실행하세요.
COMMIT;
활성 트랜잭션 안이 아니라면 COMMIT 문은 실패해요.
트랜잭션 롤백
트랜잭션을 중단할 수 있어요. 롤백이라고도 불리는 이 연산은 트랜잭션이 데이터베이스에 만든 모든 변경을 버립니다. 트랜잭션을 중단하려면 다음을 실행하세요.
ROLLBACK;
동일한 동작을 하는 abort 명령어도 사용할 수 있어요.
ABORT;
활성 트랜잭션 안이 아니라면 ROLLBACK과 ABORT 문은 실패해요.
다중 문장 트랜잭션
여러 SQL 문장이 함께 제출되면(예: 세미콜론으로 구분) 단일 암묵적 트랜잭션 안에서 실행돼요. 어떤 문장이 실패하면 배치의 모든 이전 문장도 롤백됩니다. 이는 COPY FROM DATABASE처럼 여러 내부 연산으로 분해되는 PRAGMA 명령에도 적용돼요.
격리 수준
DuckDB의 동시성 모델은 **스냅샷 격리(snapshot isolation)**를 보장해요. 이 격리 수준을 위반하는 트랜잭션은 중단됩니다.
PostgreSQL의 트랜잭션 격리 수준을 사용해 말하면, DuckDB는 *반복 읽기(repeatable reads)*를 보장해요.
예시
간단한 예시로 트랜잭션 사용을 설명할게요.
CREATE TABLE person (name VARCHAR, age BIGINT);
BEGIN TRANSACTION;
INSERT INTO person VALUES ('Ada', 52);
COMMIT;
BEGIN TRANSACTION;
DELETE FROM person WHERE name = 'Ada';
INSERT INTO person VALUES ('Bruce', 39);
ROLLBACK;
SELECT * FROM person;
첫 번째 트랜잭션(“Ada” 삽입)은 커밋됐지만, 두 번째 트랜잭션(“Ada” 삭제와 “Bruce” 삽입)은 중단됐어요. 따라서 결과 테이블에는 <'Ada', 52>만 포함됩니다.
더 알아보기 (Learn more)
- 격리 수준에 대한 PostgreSQL 설명은 PostgreSQL 트랜잭션 격리 문서를 참고해 주세요.