트랜잭션은 데이터베이스에서 하나의 논리적인 작업 단위를 의미하며, 다음의 ACID의 원칙을 만족해야 한다.
- Atomicity(원자성): 트랜잭션 내 모든 작업이 완전히 수행되거나 전혀 수행되지 않아야 한다.
- Consistency(일관성): 트랜잭션 수행 전후에 데이터의 무결성이 유지되어야 한다.
- Isolation(고립성): 트랜잭션이 다른 트랜잭션의 영향을 받지 않아야 한다.
- Durability(지속성): 트랜잭션이 성공적으로 완료되면, 그 결과는 영구적으로 반영되어야 한다.
트랜잭션이 ACID 원칙을 준수하면 데이터베이스의 안정성과 신뢰성을 보장할 수 있다.
트랜잭션의 예시로, 은행에서 A 계좌에서 B 계좌로 송금하는 경우 다음의 두 가지 작업이 함께 수행되어야 한다.
- A 계좌에서 10만원을 출금
- B 계좌에서 10만원을 입금
이 과정에서 하나라도 실패하면 전체 작업이 취소되어야 한다. 만약 A 계좌에서 돈이 빠져나갔는데, B 계좌에 입금되지 않으면 데이터의 정합성이 깨지게 된다.
이처럼 데이터의 일관성과 안정성을 유지하기 위해 트랜잭션은 ACID 원칙을 따라야 한다.
ACID 원칙 상세 설명은 아래와 같다.
- Atomicity(원자성) - All or Nothing
- 트랜잭션 내의 작업들이 모두 성공하거나, 하나라도 실패하면 전체 트랜잭션이 롤백(취소)되어야 한다.
- 예를 들어, A 계좌에서 돈을 출금했지만 B 계좌로 입금하는 과정에서 오류가 발생하면 출금된 돈도 원래대로 되돌려야 한다.
- 데이터베이스에서는 COMMIT(완료) 또는 ROLLBACK(취소) 연산을 사용하여 원장성을 보장한다.
- Consistency(일관성) - 데이터 무결성 유지
- 트랜잭션이 실행되기 전과 후에 데이터베이스의 무결성이 유지되어야 한다.
- 예를 들어, 은행에서 한 계좌의 잔액이 음수가 되면 안 된다는 규칙이 있다면, 트랜잭션이 실행된 후에도 이 규칙이 유지되어야 한다.
- 제약 조건(Constraints), 외래 키(Foreign Key), 트리거(Trigger) 등을 사용하여 일관성을 유지한다.
- Isolation(고립성) - 동시에 실행되는 트랜잭션 간 충돌 방지
- 여러 개의 트랜잭션이 동시에 실행될 때 서로 간섭하지 않도록 해야 한다.
- 예를 들어, 두 사용자가 동시에 같은 계좌에서 돈을 출금할 경우, 먼저 실행된 트랜잭션이 완료될 때까지 다른 트랜잭션이 해당 데이터에 접근하지 못하도록 해야 한다.
- 격리 수준(Isolation Level)을 설정하여 고립성을 조절할 수 있다. 대표적인 격리 수준은 다음과 같다.
- READ UNCOMMITTED: 다른 트랜잭션이 아직 COMMIT 하지 않은 데이터를 읽을 수 있음 (Dirty Read 발생 가능)
- READ COMMITTED: 다른 트랜잭션이 COMMIT 한 데이터만 읽을 수 있음 (Dirty Read 방지)
- REPEATABLE READ: 하나의 트랜잭션이 같은 데이터를 여러 번 조회할 때 값이 변하지 않도록 보장 (Phantom Read 가능)
- SERIALIZABLE: 트랜잭션을 순차적으로 실행하여 완벽한 고립성을 제공하지만 성능 저하 가능
- Durability(지속성) - 완료된 트랜잭션은 영구적으로 저장
- 트랜잭션이 성공적으로 완료되면, 해당 변경 사항이 데이터베이스에 영구적으로 저장되어야 한다.
- 예를 들어, 온라인 쇼핑몰에서 사용자가 결제를 완료한 후 시스템이 다운되더라도 결제 내역은 보존되어야 한다.
- 일반적으로 데이터베이스는 로그 파일(WAL, Write-Ahead Logging)과 백업을 통해 지속성을 보장한다.
예제 코드 (MySQL)
A 계좌에서 B 계좌로 10만 원을 송금하는 트랜잭션 예제
START TRANSACTION;
-- A 계좌에서 10만 원 출금
UPDATE ACCOUNTS SET BALANCE = BALANCE - 100000 WHERE ACCOUNT_ID = 'A';
-- B 계좌에서 10만 원 입금
UPDATE ACCOUNTS SET BALANCE = BALANCE + 100000 WHERE ACCOUNT_ID = 'B';
-- 모든 작업이 성공하면 커밋
COMMIT;
만약 두 번째 UPDATE 문에서 오류가 발생하면 ROLLBACK을 사용하여 트랜잭션을 취소할 수 있다.
ROLLBACK;
'공부중 > CS 지식 한 줄' 카테고리의 다른 글
| DNS(Domian Name System) (0) | 2025.03.10 |
|---|---|
| C# var, dynamic, object 차이점 (0) | 2025.03.10 |
| C# async/await 비동기 프로그래밍 (0) | 2025.03.10 |