일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- SQL
- group by
- 트랜잭션
- docker
- oracle
- IntelliJ
- network
- 각데이터베이스별
- spring
- 티스토리챌린지
- java
- 오블완
- JPA
- analytics4
- 차이점
- mysql
- PostgreSQL
- 뷰테이블
- MongoDB
- 4요소
- 자바
- 명령어
- mssql
- Javascript
- git
- MariaDB
- DBMS
- API
- Python
- Today
- Total
hanker
SQL - 트랜잭션(Transaction) 가이드 (커밋과 롤백 활용 방법) 본문
SQL에서 트랜잭션(Transaction)은 데이터베이스의 상태를 관리하고 데이터 무결성을 보장하는 중요한 개념이다.
특히, 데이터 처리 중 오류가 발생했을 경우 롤백(ROLLBACK)으로 상태를 복원하거나, 커밋(COMMIT)으로 변경 사항을 확정ㅇ하는 기능은 트랜잭션의 핵심이다.
이번 글에서는 트랜잭션의 개념, 동작 원리, 그리고 활용 방법에 대해서 알아보자!
1. 트랜잭션(Transaction) 이란?
트랜잭션은 데이터베이스에서 수행되는 하나 이상의 작업 단위를 말한다.
데이터 무결성을 유지하기 위해 모두 성공하거나 모두 실패해야 한다.
* 무결성 : 데이터의 정확성, 일관성, 신뢰성을 전체 라이프사이클 동안 유지하는 것을 의미
트랜잭션의 4가지 특성 (ACID)
- 원자성 (Atomicity) : 트랜잭션의 모든 작업은 하나의 단위로 처리
- 일관성 (Consistency) : 트랜잭션 완료 후 데이터베이스는 일관된 상태를 유지해야 한다.
- 격리성 (Isolation) : 동시에 실행되는 트랜잭션은 서로 간섭하지 않아야 한다.
- 지속성 (Durability) : 트랜잭션 완료 후 데이터는 영구적으로 저장된다.
2. 트랜잭션 제어 명령어
2.1 START TRANSACTION (BEGiN)
트랜잭션의 시작을 알린다.
START TRANSACTION; -- MySQL
BEGIN TRANSACTION; -- MSSQL, PostgreSQL
2.2 COMMIT
트랜잭션에서 수행한 변경 사항을 확정한다.
COMMIT;
2.3 ROLLBACK
트랜잭션에서 수행한 변경 사항을 취소하고, 작업 전 상태로 되돌린다.
ROLLBACK;
2.4 SAVEPOINT
트랜잭션 내에서 특정 지점을 설정하고, 해당 지점까지 롤백할 수 있도록 한다.
SAVEPOINT savepoint_name;
ROLLBACK TO savepoint_name;
3. 트랜잭션의 사용 예제
아래 예제 코드로 사용 방법에 대해서 알아보자.
- A 계좌에서 B계좌로 송금
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1; -- A 계좌에서 100 감소
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2; -- B 계좌에서 100 증가
COMMIT; -- 성공적으로 완료
만일 두번째 (B 계좌에서 100증가) 업데이트 문에서 오류가 발생하면 ROLLBACK을 수행하여 모든 변경을 취소하면 된다.
- 주문과 재고 관리
START TRANSACTION;
INSERT INTO orders (order_id, customer_id, total) VALUES (1, 101, 500);
UPDATE inventory SET stock = stock - 1 WHERE product_id = 10;
COMMIT;
위 코드에서도 만약 재고가 부족하다면 트랜잭션을 ROLLBACK 하여 주문 데이터를 저장하지 않게 처리하면 된다.
4. 트랜잭션 격리 수준 (Isolation Levels)
트랜잭션 격리 수준은 동시에 실행되는 트랜잭션 간 간섭을 제어한다.
아래 표로 SQL 표준 4가지 격리 수준을 알아보자.
격리 수준 | 설명 | 현상 |
READ UNCOMMITTED | 다른 트랜잭션의 미확정 데이터를 읽을 수 있음 | Dirty Read |
READ COMMITTED | 확정된 데이터만 읽을 수 있음 | Non-Repeatable Read |
REPEATABLE READ | 같은 트랜잭션 내에서 동일한 데이터를 읽을 수 있음 | Phantom Read |
SERIALIZABLE | 완전한 격리를 보장 | 없음 |
설정 방법
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
START TRANSACTION;
5. 트랜잭션 사용 시 주의사항
1. 트랜잭션 크기 최소화
- 너무 큰 트랜잭션은 데이터베이스 락을 오래 유지하게 되어 성능 문제를 일으킬 수 있다.
2. 자동 커밋 확인
- 일부 데이터베이스는 기본적으로 자동 커밋이 활성화되어 있으므로, 트랜잭션을 명시적으로 시작해야한다.
SET AUTOCOMMIT = 0; -- MySQL에서 자동 커밋 비활성화
3. 데드락(Deadlock) 방지
- 여러 트랜잭션이 동일한 자원을 동시에 요청하면 데드락이 발생할 수 있다. 이를 방지하려면 트랜잭션의 순서를 명확히 정의하고, 잠금(Lock)을 최소화 해야한다.
6. 트랜잭션 실행 계획 분석
트랜잭션 성능을 최적화하려면 실행 계획을 확인해야 한다.
SHOW ENGINE INNODB STATUS; -- MySQL
EXPLAIN ANALYZE "쿼리" -- PostgreSQL
정리
트랜잭션은 데이터의 일관성과 무결성을 유지하는 데 필수적인 도구이다.
SQL의 트랜잭션 제어 명령어와 격리 수준을 적절히 활용하면 안전하고 효율적인 데이터 처리가 가능해진다!
끝.
'DATABASE > SQL' 카테고리의 다른 글
SQL - 테이블 파티셔닝(Table Partitioning) (0) | 2025.01.10 |
---|---|
SQL - 뷰(View)를 알아보자 (뷰 테이블, View Table) (0) | 2025.01.09 |
SQL - 인덱스(index) 사용법, 종류, 정의 (0) | 2025.01.05 |
SQL - Window Functions 의 모든 것 (윈도우 함수) (1) | 2025.01.04 |
SQL - 서브쿼리 사용법 (서브쿼리 활용 방법) (0) | 2025.01.03 |