-- 1. 테이블 생성
CREATE TABLE test_table (
id SERIAL PRIMARY KEY,
value TEXT
);
-- 2. 초기 데이터 삽입
INSERT INTO test_table (value) VALUES ('one');
-- 데이터 상태 확인 (트랜잭션 전)
SELECT ctid, xmin, xmax, value FROM test_table;
-- 예상 결과:
-- ctid | xmin | xmax | value
-- --------|------|------|-------
-- (0, 1) | 1 | NULL | one
-- 3. 트랜잭션 시작 및 데이터 수정
BEGIN;
UPDATE test_table SET value = 'two' WHERE id = 1;
-- 데이터 상태 확인 (트랜잭션 중)
SELECT ctid, xmin, xmax, value FROM test_table;
-- 예상 결과:
-- ctid | xmin | xmax | value
-- --------|------|------|-------
-- (0, 1) | 1 | 2 | one -- 기존 행 무효화(tmax 설정됨)
-- (0, 2) | 2 | NULL | two -- 새 행 삽입(tmin 설정됨)
-- Commit
COMMIT;
-- 데이터 상태 확인 (Commit 후)
SELECT ctid, xmin, xmax, value FROM test_table;
-- 예상 결과:
-- ctid | xmin | xmax | value
-- --------|------|------|-------
-- (0, 1) | 1 | 2 | one -- 기존 행 (Dead Tuple)
-- (0, 2) | 2 | NULL | two -- 새 행 (유효 데이터)
-- 4. 트랜잭션 시작 및 데이터 수정
BEGIN;
UPDATE test_table SET value = 'three' WHERE id = 1;
-- 데이터 상태 확인 (트랜잭션 중)
SELECT ctid, xmin, xmax, value FROM test_table;
-- 예상 결과:
-- ctid | xmin | xmax | value
-- --------|------|------|-------
-- (0, 1) | 1 | 3 | one -- 기존 행 무효화(tmax 설정됨)
-- (0, 3) | 3 | NULL | three -- 새 행 삽입(tmin 설정됨)
-- Rollback
ROLLBACK;
-- 데이터 상태 확인 (Rollback 후)
SELECT ctid, xmin, xmax, value FROM test_table;
-- 예상 결과:
-- ctid | xmin | xmax | value
-- --------|------|------|-------
-- (0, 1) | 1 | NULL | one -- 기존 행 복구(tmax 값 제거)
-- (0, 3) | 3 | NULL | three -- 새 행 (Dead Tuple)
-- 5. Rollback 또는 Commit 후 Dead Tuple 정리
VACUUM test_table;
-- 데이터 상태 확인 (VACUUM 후)
SELECT ctid, xmin, xmax, value FROM test_table;
-- 예상 결과 (Dead Tuple 제거):
-- ctid | xmin | xmax | value
-- --------|------|------|-------
-- (0, 1) | 1 | NULL | one -- Rollback 후 복구된 데이터
-- 또는
-- ctid | xmin | xmax | value
-- --------|------|------|-------
-- (0, 2) | 2 | NULL | two -- Commit 후 유효 데이터만 남음
-- 6. 트랜잭션 상태에 따른 SELECT 동작 확인
BEGIN;
UPDATE test_table SET value = 'four' WHERE id = 1;
-- 데이터 상태 확인 (트랜잭션 중)
SELECT value FROM test_table;
-- 예상 결과:
-- "one" (트랜잭션이 완료되지 않아 변경 전 데이터 반환)
-- Commit 후 데이터 확인
COMMIT;
SELECT value FROM test_table;
-- 예상 결과:
-- "four" (트랜잭션 완료 후 변경 데이터 반환)