트랜잭션이란?
- 하나의 논리적 작업을 수행하기 위해 필요한 데이터베이스 연산들의 모임
- 데이터베이스 논리적 작업 단위 -> 일반적으로 프로젝트 명세서의 기능 하나에 대응
ex. 회원가입, 상품주문, 게시글 등록, 송금 등
- All-or-nothing: 완전히 처리되거나, 전혀 처리되지 않아야 함 (미완결 상태로 중단 x)
- 장애 발생 시, 복구 단위도 트랜잭션
트랜잭션의 특성(ACID)
- 원자성(Atomicity): ALL-OR-NOTHING
- 일관성(Consistency): 실패했든, 성공했든, 모순없이 일관된 상태를 유지해야 한다는 것.
- 격리성(Isolation): 현재 트랜잭션 수행되고 있다면 끝날 때까지 다른 트랜잭션 접근 불가
* 독립적 수행이 원칙
- 지속성(Durability): 트랜잭션이 성공적으로 완료된 후 데이터베이스에 반영된 트랜잭션 작업 결과는 어떠한 경우에도(장애가 발생해도) 손실되지 않고 영구적이어야 함.
트랜잭션의 연산과 상태 변화
TCL(Transaction Control Language)
- COMMIT: 트랜잭션 성공적 완료 -> SQL 연산들을 거친 최종 상태를 DB에 반영
- ROLLBACK: 트랜잭션 실패 -> 마지막 COMMIT 이후에 수행된 세부 연산들 취소
- SAVEPOINT: ROLLBACK 시 부분 작업 취소를 위한 저장 포인트 설정 -> ROLLBACK 시 지정한 저장 포인트까지의 상태로 DB 되돌림
예제
예제1: 트랜잭션 연산에 따른 상태 변화 이해
Q) 다음 SQL 구문들이 모두 실행된 후의 최종 출력값을 구하라.
start transaction;
insert into 주문 values (1004, 2000);
commit; //성공 -> 반영
start transaction;
delete from 주문 where 고객변호 = 1001;
update 주문 set 주문금액 = 5000 where 고객번호 = 1003;
insert into 주문 values (1005, 4000);
rollback; //실패 -> 미반영
start transaction;
update 주문 set 주문금액 = 5000 where 주문금액 = 1000;
commit; //성공 -> 반영
select count(*) from 주문 where 주문금액 > 3000;
예제2: AUTO_COMMIT 옵션
- 트랜잭션 지원 엔진: InnoDB 엔진
- AUTO_COMMIT 옵션: COMMIT 명령을 수행하지 않아도 자동으로 COMMIT됨.
- START TRANSACTION 이후, 명시적인 COMMIT 또는 ROLLBACK 없이 다시 새로운 START TRANSACTION -> 이전 트랜잭션은 자동으로 COMMIT
start transaction;
insert into 주문 values (1004, 2000);
commit;
start transaction;
delete from 주문 where 고객번호 = 1001;
update 주문 set 주문금액 = 5000 where 고객번호 = 1003;
insert into 주문 values (1005, 4000); //commit 없어도 자동 commit
start transaction;
update 주문 set 주문금액 = 5000 where 주문금액 = 1000;
commit;
select count(*) from 주문 where 주문금액 > 3000;
=> 정답: 2
예제3: SAVEPOINT 지정
start transaction;
savepoint sp1;
insert into 주문 values (1004, 2000);
savepoint sp2;
delete from 주문 where 고객번호 = 1001;
update 주문 set 주문금액 = 5000 where 고객번호 = 1003;
savepoint sp3;
insert into 주문 values (1005, 4000);
update 주문 set 주문금액 = 5000 where 주문금액 = 1000;
rollback to savepoint sp1(sp2/sp3); //셋 다 고려해보기
commit;
select count(*) from 주문 where 주문금액 > 3000;
=> 정답:
rollback to savepoint sp1일 때: 0
rollback to savepoint sp2일 때: 0
rollback to savepoint sp3일 때: 1
트랜잭션 설계 기초
1. 필요한 쿼리만 트랜잭션으로 묶고 트랜잭션 범위를 좁게 유지하도록 설계하자.
2. 장시간 유지되는 트랜잭션은 가능하면 피하자.
두 엔터티의 관계 | 두 엔터티에 대한 트랜잭션 설계 | 비고 |
필수 참여 관계 | 하나의 트랜잭션 안에 포함 | 두 엔터티가 서로 독립적 수행이 가능하다면 선택적 참여 관계로 표현 |
식별자 관계 | 부모 엔터티의 레코드가 삭제/변경될 때 이와 연관된 자식 엔터티의 레코드에도 영향이 가기 때문 | |
비식별자 관계 | 별개의 트랜잭션으로 분리 | 부모 엔터티의 레코드가 삭제/변경되더라도 연관된 자식 엔터티의 레코드에 직접적 영향은 없음 |
'백엔드 > SQL' 카테고리의 다른 글
쿼리 프로세싱과 최적화 (0) | 2025.06.03 |
---|---|
인덱싱 (0) | 2025.06.01 |
관계 데이터베이스 설계 - 함수 종속성과 정규화 (0) | 2025.05.28 |
데이터베이스 설계와 개체-관계 모델 (0) | 2025.05.27 |
SQL을 활용한 데이터 집계와 분석(2) (0) | 2025.05.26 |