DB/MySQL

[SQL] 트랜잭션

baek-dev 2024. 12. 17. 18:47

트랜잭션은 데이터베이스 관리에서 작업의 단위를 의미한다

하나의 트랜잭션은 일련의 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. 트랜잭션의 동작 흐름

  1. 트랜잭션 시작 : `BEGIN TRANSACTION` 명령어 또는 데이터베이스 클라이언트가 암묵적으로 시작
  2. SQL 작업 실행 : 하나 이상의 SQL 명령문 실행
  3. 커밋 또는 롤백 
    1. 커밋 : 트랜잭션의 모든 작업을 성공적으로 완료하고 데이터베이스에 영구적으로 반영
    2. 롤백 : 트랜잭션의 작업을 취소하고 원래 상태로 되돌림

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