트랜잭션은 데이터베이스 관리에서 작업의 단위를 의미한다
하나의 트랜잭션은 일련의 SQL 작업들을 논리적으로 묶어 처리하며,
이 작업들이 모두 성공하거나 실패하는 원자성(Atomicity)을 보장한다
1. 트랜잭션의 기본 개념
1.1. 트랜잭션이란?
- 데이터베이스의 상태를 변경하는 작업 단위
- 데이터베이스는 트랜잭션 단위로 작업을 처리하며, 각 트랜잭션은 일관성과 안정성을 유지해야 한다
1.2. 트랜잭션의 주요 특징 (ACID 속성)
트랜잭션의 신뢰성을 보장하기 위해 ACID 속성을 따른다
1.2.1. Atomicity (원자성)
- 트랜잭션의 작업은 모두 성공하거나 모두 실패해야 한다
- 부분적으로 작업이 수행된 상태는 허용되지 않음
1.2.2. Consistency (일관성)
- 트랜잭션이 완료된 후에도 데이터베이스는 항상 일관된 상태를 유지해야 한다
1.2.3. Isolation (고립성)
- 여러 트랜잭션이 동시에 실행될때, 서로 간섭하지 않고 독립적으로 수행되어야 한다
1.2.4. Durability (지속성)
- 트랜잭션이 성공적으로 완료되면, 그 결과는 영구적으로 반영되어야 한다
2. 트랜잭션의 동작 흐름
- 트랜잭션 시작 : `BEGIN TRANSACTION` 명령어 또는 데이터베이스 클라이언트가 암묵적으로 시작
- SQL 작업 실행 : 하나 이상의 SQL 명령문 실행
- 커밋 또는 롤백
- 커밋 : 트랜잭션의 모든 작업을 성공적으로 완료하고 데이터베이스에 영구적으로 반영
- 롤백 : 트랜잭션의 작업을 취소하고 원래 상태로 되돌림
3. 트랜잭션 명령어
3.1. 트랜잭션 시작
- 명시적으로 트랜잭션을 시작
BEGIN TRANSACTION;
-- 또는
START TRANSACTION;
3.2. 작업 완료 COMMIT
- 트랜잭션에서 실행된 작업을 데이터베이스에 반영
COMMIT;
3.3. 작업 취소 ROLLBACK
- 트랜잭션에서 실행된 작업을 취소하고 원래 상태로 되돌잗
ROLLBACK;
3.4. 자동 커밋
- 대부분의 데이터베이스는 기본적으로 자동커밋 모드가 활성화되어있음
- 트랜잭션을 수동으로 제어하려면 자동커밋을 비활성화해야 한다
SET AUTOCOMMIT = 0; -- 자동 커밋 비활성화
SET AUTOCOMMIT = 1; -- 자동 커밋 활성화
4. 트랜잭션 격리 수준
트랜잭션 격리 수준은 여러 트랜잭션이 동시에 실행될 때 데이터의 일관성을 유지하기 위한 규칙이다
격리 수준에 따라 데이터 충돌(Dirty Read, Non-Repeatable Read, Phantom Read) 문제가 발생할 수 있다
4.1. 주요 격리 수준
격리 수준 | 설명 | 문제점 |
READ UNCOMMITTED | 다른 트랜잭션이 커밋하지 않은 데이터도 읽을 수 있음 | Dirty Read 발생 가능 |
READ COMMITTED | 커밋된 데이터만 읽을 수 있음 | Non-Repeatable Read 발생 가능 |
REPEATABLE READ | 동일 트랜잭션에서 동일 쿼리 실행 시 항상 동일한 결과를 반환 | Phantom Read 발생 가능 |
SERIALIZABLE | 트랜잭션 간 완전한 격리 보장 | 성능 저하 발생 가능 |
4.2. 문제점과 사례
- Dirty Read: 트랜잭션이 커밋되지 않은 데이터를 읽음
- Non-Repeatable Read: 같은 데이터를 두 번 읽었을 때 다른 값이 반환됨
- Phantom Read: 트랜잭션 중 데이터 삽입/삭제로 인해 쿼리 결과가 달라짐
5. 트랜잭션 사용 예제
5.1. 성공적인 트랜잭션
START TRANSACTION;
INSERT INTO accounts (id, balance) VALUES (1, 1000);
UPDATE accounts SET balance = balance - 500 WHERE id = 1;
UPDATE accounts SET balance = balance + 500 WHERE id = 2;
COMMIT; -- 트랜잭션 성공적으로 완료
5.2. 트랜잭션 롤백
START TRANSACTION;
UPDATE accounts SET balance = balance - 500 WHERE id = 1;
-- 오류 발생 시 롤백
IF ERROR THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
6. 트랜잭션과 데이터베이스
6.1. 트랜잭션을 지원하는 데이터베이스
대부분 관계형 데이터베이스는 트랜잭션을 지원한다
- MySQL: InnoDB 스토리지 엔진을 사용하면 트랜잭션 지원
- PostgreSQL: 트랜잭션을 기본적으로 지원
- Oracle, SQL Server: 트랜잭션 지원
7. 트랜잭션 활용 사례
- 은행 시스템
- 송금 작업: 한 계좌에서 금액을 차감하고, 다른 계좌에 금액을 추가
- 작업 중 하나라도 실패하면 롤백
- 전자 상거래
- 주문 처리: 상품 재고 차감, 결제 완료, 주문 기록 추가
- 일부 작업이 실패하면 전체 트랜잭션 취소
- 로그 관리
- 다중 테이블에 로그 기록 삽입 중 하나라도 실패 시 전체 작업 롤백
8. 트랜잭션의 장단점
장점
- 데이터 일관성 보장: 작업 중 오류 발생 시 데이터 손실 방지
- 동시성 제어: 다중 사용자 환경에서 데이터 충돌 최소화
- 안전한 작업 단위: 복잡한 작업을 원자적으로 처리
단점
- 성능 저하: 높은 격리 수준에서 동시성이 낮아질 수 있음
- 데드락(Deadlock): 두 개 이상의 트랜잭션이 서로의 리소스를 기다리며 멈추는 상황
- 설계 복잡성 증가: 정확한 트랜잭션 관리가 필요
요약
SQL 트랜잭션은 데이터베이스에서 작업의 안정성과 일관성을 보장하기 위한 중요한 메커니즘
ACID 속성을 이해하고 적절한 격리 수준을 설정하면 안정적이고 효율적인 데이터베이스를 설계할 수 있다
출처 : ChatGPT
'DB > MySQL' 카테고리의 다른 글
[SQL] SQL Dialects (SQL 방언) (0) | 2025.02.21 |
---|---|
[SQL] CHAR, VARCHAR (1) | 2024.12.18 |
[SQL] 연산자 (0) | 2024.12.10 |
[SQL] sql 명령어 (0) | 2024.12.03 |
[SQL] SQL이란? (0) | 2024.12.03 |