본문 바로가기
백엔드/SQL

트랜잭션

by dustnn 2025. 5. 31.
트랜잭션이란?

 

 

- 하나의 논리적 작업을 수행하기 위해 필요한 데이터베이스 연산들의 모임

- 데이터베이스 논리적 작업 단위 -> 일반적으로 프로젝트 명세서의 기능 하나에 대응

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

autocommit 옵션 줌

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. 장시간 유지되는 트랜잭션은 가능하면 피하자.

 

두 엔터티의 관계 두 엔터티에 대한 트랜잭션 설계 비고
필수 참여 관계 하나의 트랜잭션 안에 포함 두 엔터티가 서로 독립적 수행이 가능하다면 선택적 참여 관계로 표현
식별자 관계 부모 엔터티의 레코드가 삭제/변경될 때 이와 연관된 자식 엔터티의 레코드에도 영향이 가기 때문
비식별자 관계 별개의 트랜잭션으로 분리 부모 엔터티의 레코드가 삭제/변경되더라도 연관된 자식 엔터티의 레코드에 직접적 영향은 없음