트랜잭션(Transaction)이란?
트랜잭션(Transaction)은 데이터베이스의 논리적 작업 단위
데이터 베이스의 상태를 바꾸기 위해 하나의 작업을 수행하기 위해 실행되는 일련의 연산들을 의미
트랜잭션이 성공적으로 수행되면 데이터베이스는 영구적으로 변경되며, 실패하면 변경 사항이 취소된다.
작업 단위? 하나의 작업?
DB에서 작업 단위(Unit of Work)는 하나의 논리적인 작업을 수행하는 최소 단위며, 하나의 쿼리 묶음이라고 생각하면 된다.
쉽게 말해, "이거 하나는 다 처리되어야 해!"라고 묶을 수 있는 작업 덩어리라고 볼 수 있다.
즉, 많은 SQL 명령문들을 사람이 정하는 기준에 따라 정하는 것이다.
📌 예제 1: 은행 계좌 이체
💰 "A 계좌에서 5만 원 빼고, B 계좌에 5만 원 넣어줘!"
- 이 작업은 반드시 함께 실행되어야 한다. (한쪽만 실행되면 돈이 사라지거나, 뻥튀기될 수도 있음)
- 따라서 이 두 가지 작업을 하나의 작업 단위로 묶어야 한다.
👉 작업 단위:
- A 계좌에서 50,000원 출금
- B 계좌에 50,000원 입금
이 두 개가 하나의 묶음이다.
만약 중간에 오류가 나서 A에서 돈만 빠져나가고 B에는 입금되지 않았다면?
→ 전체 작업을 취소(ROLLBACK)하고 처음 상태로 되돌려야 한다!
📌 예제 2: 쇼핑몰에서 주문하기
🛒 "상품 하나 주문했을 때 해야 할 일"
- 상품 재고 줄이기 (재고에서 상품 하나 빼기)
- 주문 내역 저장 (내가 어떤 상품을 주문했는지 기록)
- 결제 정보 저장 (내가 결제한 내역 저장)
이 세 가지가 전부 다 성공해야 정상적으로 주문이 완료된다.
하나라도 실패하면? → 전부 취소(ROLLBACK)하고 처음 상태로 되돌려야 한다.
📌 트랜잭션과의 관계
- 작업 단위는 트랜잭션이 보장해 주는 논리적인 작업 덩어리이다.
- 트랜잭션은 이 작업 단위들을 "묶어서 한 번에 처리" 하거나 "오류 나면 전부 취소" 하도록 해준다.
👉 즉, 트랜잭션을 쓰는 이유는?
➡ 작업 단위가 온전하게 실행되도록 보장하기 위해서
상태를 변화시킨다?
상태를 변화시킨다는 것은 SQL 질의어를 통해 DB에 접근하는 것으로, 쿼리를 날려 연산을 수행하는 것을 의미한다.
SQL 질의어 : SELECT, INSERT, DELETE, UPDATE
트랜잭션의 특성 (ACID)
트랜잭션이 올바르게 수행되려면 ACID 원칙을 준수해야 한다.
- Atomicity (원자성)
- All or Nothing
- 트랜잭션의 연산들이 모두 수행되거나, 하나도 수행되지 않아야 한다.
- 예: A → B로 돈을 이체할 때, A의 돈이 빠져나갔지만 B의 계좌에는 입금되지 않는 경우가 없어야 한다.
- 원자성은 수행하고 있는 트랜잭션에 의해 변경된 내역을 유지하면서, 이전에 커밋된 상태를 임시 영역에 따로 저장함으로써 보장
- 현재 수행하고 있는 트랜잭션에서 오류가 발생하면 현재 내역을 날리고 임시 영역에 저장해뒀던 상태로 rollback
- 롤백 세그먼트(rollback segment): 이전 데이터들이 임시로 저장되는 영역으로, 수정되기 전의 파일이나 블록 ID 같은 블럭 정보 및 데이터를 저장
- 일반적으로 Rollback을 명시하면 INSERT, DELETE, UPDATE 등의 작업 전체가 취소되는데, 확실하게 오류가 발생하지 않은 부분도 다시 처음부터 작업을 수행해야 한다. (문제점)
- 이러한 부분을 해결하기 위해 중간 저장 지점인 save point를 지정하여 해결 가능
- save point를 사용하면 전체가 아닌 특정 부분에서 트랜잭션을 취소시킬 수 있다.
- 현재 수행하고 있는 트랜잭션에서 오류가 발생하면 현재 내역을 날리고 임시 영역에 저장해뒀던 상태로 rollback
commit; --마지막 commit
update dept
set dname = 'QC2'
where deptno=70;
savepoint SP1; --SP1 세이브포인트
delete from dept
where deptno = 70;
savepoint SP2; --SP2 세이브포인트
insert into dept values (50, '부서명', '지역명');
rollback; -- savepoint가 없으면 마지막 commit 시점으로 돌아가서 update/delete/insert 모두 롤백됨
rollback to savepoint SP1; -- SP1 시점으로 이동하여, SP1 이후로 수행했던 작업들이 모두 롤백됨
- save point: 트랜잭션 내부에서 사용자가 지정할 수 있는 세부 작업 단위
- 특정 지점에 SAVEPOINT SP1를 설정 한 후 ROLLBACK TO SP1를 통해 해당 지점으로 롤백할 수 있음
2. Consistency (일관성)
- 트랜잭션이 실행되기 전과 후에 데이터베이스의 무결성이 유지되어야 한다.
- 트랜잭션은 완료 후에도 데이터베이스가 일관된 상태로 유지되어야 한다.
- 예: 은행 계좌의 전체 잔액 합계가 변하지 않아야 한다.
- 트랜잭션에서는 트리거를 통해서 일관성을 보장
- 트리거는 특정 테이블에 쿼리 작업과 같은 이벤트가 발생했을 때, 사용자가 직접 호출하는 것이 아닌 데이터베이스에서 자동으로 호출하여 동작하도록 하는 것
- ex) 데이터베이스에서는 정보의 수정이 일어났을 경우에 다른 테이블도 함께 정보가 수정될 수 있도록 명시적으로 자동 업데이트하는 명령을 구성함
트리거란?
DB가 수정될 때, 개발자가 실수로 지우거나 수정하면 안되는 정보를 잘못 수정할 수 있기 때문에 미리 트리거를 설정하여 삭제를 하려고 하거나 수정을 하려고 하면 트리거가 실행되어 이러한 잘못된 DB 접근을 방지하는 것
3. Isolation (고립성, 격리성)
- 여러 트랜잭션이 동시에 실행되더라도 서로의 작업에 영향을 주지 않아야 한다.
- 하나의 트랜잭션이 실행하는 도중에 변경한 데이터는 해당 트랜잭션이 완료될 때까지 다른 트랜잭션이 참조하지 못한다.
- 예: 두 사용자가 동시에 같은 계좌에서 출금하려 할 때, 하나의 트랜잭션이 완료될 때까지 다른 트랜잭션이 영향을 받지 않도록 해야한다.
4. Durability (지속성, 영구성)
- 트랜잭션이 완료된 후에는 시스템 장애가 발생해도 변경 사항이 유지되어야 한다.
- 성공적으로 수행된 트랜잭션은 영원히 반영되어야 한다.
- 예: 전산 시스템이 꺼지더라도 송금 기록이 유지되어야 합니다.
- DBMS에서는 영구성을 보장하기 위해 미리 쓰기 로깅(WAL - Write Ahead Logging)을 사용한다.
- 영속성만 보장해 주는 것이 아니라 log는 여러가지를 보장해주는데 그 중 영구성도 보장 -
- WAL에서는 실제 데이터베이스를 수정하기 전에 DBMS가 변경 사항을 디스크의 로그 파일에 기록한다.
- 로그(Log)는 로그 레코드의 연속이며 데이터베이스의 모든 갱신 작업을 저장한다.
- 변경 사항이 로그에 안전하게 기록되면 DBMS가 데이터베이스를 업데이트 한다.
- 이후, 시스템 충돌과 같은 장애가 발생하면 DBMS는 기록된 트랜잭션을 재생하고 데이터를 일관된 상태로 복원하여 데이터베이스를 복구할 수 있다.
- 영속성만 보장해 주는 것이 아니라 log는 여러가지를 보장해주는데 그 중 영구성도 보장 -
트랜잭션의 상태
트랜잭션은 아래와 같은 상태를 거친다.
- Active (활성) : 트랜잭션이 시작되어 처리 중인 상태 (실행중)
- Partially Committed (부분 완료) : 트랜잭션의 마지막 연산까지 처리가 완료되었지만 DB에 트랜잭션 수행 결과가 반영되지 않은 상태 (Commit 연산이 실행되기 직전 상태)
- Committed (완료) : 트랜잭션이 정상적으로 완료되어 변경 사항이 데이터베이스에 반영된 상태
- Failed (실패) : 트랜잭션 처리 중 오류로 인해 트랜잭션이 중단된 상태
- Aborted (철회) : 실패한 트랜잭션이 롤백(rollback)되어 원래 상태로 복구된 상태
트랜잭션 수행 단계 도식화
트랜잭션 명령어 (SQL)
TCL (Transaction Control Language)
트랜잭션을 다룰 때 일반적으로 사용되는 SQL 명령어
상태를 변화시킨다. → SQL 질의어를 통해 DB에 접근한다.
1. 트랜잭션 시작
START TRANSACTION;
또는
BEGIN;
2. 트랜잭션 저장 (완료)
COMMIT;
- 모든 변경 사항을 데이터베이스에 반영
- 트랜잭션이 정상적으로 종료되어 DB에 변경 사항을 반영하는 명령어
- 한 개의 논리적 단위(트랜잭션)에 대한 작업이 성공적으로 끝났고 데이터베이스가 다시 일관된 상태에 있을 때, 이 트랜잭션이 행한 갱신 연산이 완료된 것을 트랜잭션 관리자에게 알려주는 연산
3. 트랜잭션 취소 (롤백)
ROLLBACK;
- 트랜잭션이 비정상적으로 종료되어 트랜잭션이 수행한 변경 사항을 취소하고 DB를 이전 상태로 되돌리는 명령어
- 하나의 트랜잭션 처리가 비정상적으로 종료되어 데이터베이스의 일관성을 깨뜨렸을 때, 이 트랜잭션의 일부가 정상적으로 처리되었더라도 트랜잭션의 원자성을 구현하기 위해 이 트랜잭션이 행한 모든 연산을 취소(Undo)하는 연산
- Rollback 시에는 해당 트랜잭션을 재시작하거나 폐기함
4. 특정 지점까지 롤백 (세이브포인트)
SAVEPOINT 저장점이름;
ROLLBACK TO 저장점이름;
- 트랜잭션에서 특정 지점을 지정하는 명령어로, ROLLBACK과 함께 사용하면 해당 지점까지 되돌릴 수 있다.
정리
- 트랜잭션은 데이터베이스의 논리적 작업 단위
- ACID 원칙을 따라야 데이터 무결성이 보장됨
- COMMIT, ROLLBACK, SAVEPOINT 같은 명령어를 활용하여 트랜잭션을 제어 가능
- 트랜잭션 격리 수준을 조정하여 동시성 문제 해결 가능
데이터베이스를 안전하게 운영하기 위해서는 트랜잭션 관리가 필수!
트랜잭션을 사용할 때 주의할 점
트랜잭션은 꼭 필요한 최소의 코드에만 적용하는 것이 좋다. → 트랜잭션의 범위를 최소화하라는 의미다.
일반적으로 데이터베이스 커넥션은 개수가 제한적이다. 그런데 각 단위 프로그램이 커넥션을 소유하는 시간이 길어진다면 사용 가능한 여유 커넥션의 개수는 줄어들게 된다.
그러다 어느 순간에는 각 단위 프로그램에서 커넥션을 가져가기 위해 기다려야 하는 상황이 발생할 수도 있는 것이다.
reference
https://sangyunpark99.tistory.com/entry/DB-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98
[DB] 트랜잭션
"트랜잭션은 하나의 작업 단위라고 하는데, 그렇다면 트랜잭션이란 무엇일까?" 이번 글에서는 데이터베이스에서 중요한 개념인 트랜잭션의 개념에 대해 알아보겠습니다.(단, 트랜잭션 격리 수
sangyunpark99.tistory.com
https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/main/Database#transaction
Interview_Question_for_Beginner/Database at main · JaeYeopHan/Interview_Question_for_Beginner
:boy: :girl: Technical-Interview guidelines written for those who started studying programming. I wish you all the best. :space_invader: - JaeYeopHan/Interview_Question_for_Beginner
github.com
https://github.com/jmxx219/CS-Study/blob/main/database/%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98.md
CS-Study/database/트랜잭션.md at main · jmxx219/CS-Study
Computer Science && Tech Interview . Contribute to jmxx219/CS-Study development by creating an account on GitHub.
github.com
tech-interview-for-developer/Computer Science/Database/Transaction.md at master · gyoogle/tech-interview-for-developer
👶🏻 신입 개발자 전공 지식 & 기술 면접 백과사전 📖. Contribute to gyoogle/tech-interview-for-developer development by creating an account on GitHub.
github.com
https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/main/Database#transaction
Interview_Question_for_Beginner/Database at main · JaeYeopHan/Interview_Question_for_Beginner
:boy: :girl: Technical-Interview guidelines written for those who started studying programming. I wish you all the best. :space_invader: - JaeYeopHan/Interview_Question_for_Beginner
github.com
Ready-For-Tech-Interview/Database/트랜잭션.md at master · WooVictory/Ready-For-Tech-Interview
💻 신입 개발자로서 지식을 쌓기 위해 공부하는 공간 👨💻. Contribute to WooVictory/Ready-For-Tech-Interview development by creating an account on GitHub.
github.com
https://theheydaze.tistory.com/582
03. 기술 면접 - 데이터베이스 - 트랜잭션 (Transaction)
공부목적으로 다른 블로그의 글을 그대로 따라치면서 작성되었습니다. 저작권 문제 시, 비공개 처리하겠습니다 트랜잭션이란? - 데이터베이스의 상태를 변환시키는 하나의 논리적인 작업 단위
theheydaze.tistory.com
https://dev-coco.tistory.com/158
신입 개발자 기술면접 질문 정리 - 데이터베이스
💡 데이터베이스의 특징에 대해 설명해주세요. 실시간 접근성(Real-Time Accessibility) : 비정형적인 질의(조회)에 대하여 실시간 처리에 의한 응답이 가능해야 하며, 지속적인 변화(Continuous Evloution) :
dev-coco.tistory.com
https://velog.io/@zxzz45/%EA%B8%B0%EC%88%A0-%EB%A9%B4%EC%A0%91%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98
기술 면접(트랜잭션)
서비스에서 보면 @Transectional이 들어간 것을 볼 수 있습니다.트랜잭션은 DB의 상태를 변경시키기 위해 수행하는 작업 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미한다. 여기서 D
velog.io
https://f-lab.kr/insight/transaction-exception-handling-20240521
트랜잭션과 예외 처리: 면접에서의 핵심 질문 대비하기
이 글에서는 트랜잭션과 예외 처리에 대한 기본 개념부터 면접에서 자주 묻는 질문과 그에 대한 답변 방법까지 다룹니다. 트랜잭션의 주요 속성인 ACID, 트랜잭션 격리 수준, 예외 처리의 중요성,
f-lab.kr
CS-Study/database/트랜잭션의 격리성.md at main · jmxx219/CS-Study
Computer Science && Tech Interview . Contribute to jmxx219/CS-Study development by creating an account on GitHub.
github.com
'데이터베이스' 카테고리의 다른 글
[DB] 데이터베이스 락(Locking) & 동시성 제어 (0) | 2025.04.07 |
---|---|
[DB] SQL Injection (0) | 2025.03.13 |
[DB] Index (0) | 2025.03.06 |
[DB] 트랜잭션 격리 수준 (Isolation Level) (2) | 2025.02.20 |