트랜잭션: 두 판 사이의 차이

기술노트
(Gemini 벌크 업로더로 자동 업로드)
(Gemini 벌크 업로더로 자동 업로드)
 
(같은 사용자의 중간 판 2개는 보이지 않습니다)
1번째 줄: 1번째 줄:
== 🔄 트랜잭션 (Transaction) ==
<div style="font-family: 'Malgun Gothic';">
= 트랜잭션 (Transaction) =
[[기술면접 CS 지식|← 목록으로 돌아가기]]


'''트랜잭션'''은 데이터베이스의 상태를 변화시키기 위해 수행되는 '''하나의 논리적인 작업 단위'''입니다. 여러 개의 SQL 명령어를 하나로 묶어서, 마치 하나의 작업처럼 모두 성공하거나 모두 실패하도록 만듭니다.
'''트랜잭션은 데이터베이스의 상태를 변화시키기 위해 수행하는 논리적인 작업의 단위입니다.'''


은행 계좌 이체를 예로 들면, A의 계좌에서 돈을 빼는 작업(UPDATE)과 B의 계좌에 돈을 넣는 작업(UPDATE)은 반드시 하나의 트랜잭션으로 묶여야 합니다. 둘 중 하나라도 실패하면 모든 작업을 원래대로 되돌려야 데이터의 일관성이 유지됩니다.
하나의 트랜잭션은 한 개 이상의 SQL 쿼리(INSERT, DELETE, UPDATE )를 포함할 수 있습니다. 예를 들어, '계좌 이체'라는 하나의 논리적 작업을 위해 'A 계좌 잔액 차감''B 계좌 잔액 증가'라는 두 개의 쿼리가 실행되어야 합니다. 데이터베이스는 이 두 쿼리를 하나의 트랜잭션, 즉 쪼갤 수 없는 작업 단위로 묶어 데이터의 무결성과 일관성을 보장합니다.


----
----


=== 🔥 트랜잭션의 특징: ACID ===
== 트랜잭션이 필요한 이유 ==
만약 트랜잭션이라는 개념이 없다면, 'A 계좌 잔액 차감'에는 성공했지만, 그 직후 시스템 장애로 'B 계좌 잔액 증가'에는 실패하는 상황이 발생할 수 있습니다. 이 경우 A의 돈은 사라졌지만 B에게는 전달되지 않아 데이터의 정합성이 깨지는 심각한 문제가 발생합니다. 트랜잭션은 이와 같은 문제를 방지하고 데이터베이스를 항상 신뢰할 수 있는 상태로 유지하기 위해 반드시 필요합니다.


트랜잭션은 데이터의 무결성과 신뢰성을 보장하기 위해 '''ACID'''라는 네 가지 핵심적인 특징을 만족해야 합니다.
----
 
== 트랜잭션의 핵심 속성: ACID ==
신뢰할 수 있는 트랜잭션은 반드시 4가지 핵심 속성을 만족해야 하며, 이를 **ACID**라고 부릅니다.
 
*  **원자성 (Atomicity):** 트랜잭션의 모든 작업이 전부 성공하거나, 전부 실패해야 합니다.
*  **일관성 (Consistency):** 트랜잭션 실행 후에도 데이터베이스는 항상 일관된 상태를 유지해야 합니다.
*  **고립성 (Isolation):** 하나의 트랜잭션은 다른 트랜잭션의 영향을 받지 않고 독립적으로 실행되어야 합니다.
*  **지속성 (Durability):** 성공한 트랜잭션의 결과는 영구적으로 저장되어야 합니다.


* '''원자성 (Atomicity)''' : 트랜잭션에 포함된 모든 작업이 '''전부 성공하거나 전부 실패'''해야 합니다. (All or Nothing)
각 속성에 대한 자세한 설명은 아래 링크를 참고하세요.
* '''일관성 (Consistency)''' : 트랜잭션이 성공적으로 완료되면, 데이터베이스는 항상 '''일관된 상태'''를 유지해야 합니다. (예: 계좌의 돈은 사라지거나 갑자기 생기지 않음)
*   **[[ACID|→ ACID 원칙 자세히 알아보기]]**
* '''고립성 (Isolation)''' : 하나의 트랜잭션이 실행되는 동안에는, 다른 트랜잭션이 중간 결과를 참조할 수 없습니다. 각 트랜잭션은 마치 '''혼자 실행되는 것처럼''' 보여야 합니다.
* '''지속성 (Durability)''' : 성공적으로 완료된 트랜잭션의 결과는 시스템에 장애가 발생하더라도 '''영구적으로 저장'''되어야 합니다.


----
----


=== ⚙️ 트랜잭션 제어 명령어 (TCL) ===
== 트랜잭션의 상태 변화 ==
트랜잭션은 실행 과정에서 다음과 같은 5가지 상태를 거칩니다.
 
; 1. 활동 (Active)
: 트랜잭션이 실행을 시작하여 현재 실행 중인 상태입니다. 연산들이 정상적으로 실행되고 있는 동안 이 상태를 유지합니다.
 
; 2. 부분 완료 (Partially Committed)
: 트랜잭션의 마지막 연산까지 모두 실행했지만, 아직 데이터베이스에 최종적으로 변경 내용을 반영하지는(COMMIT) 않은 상태입니다. 모든 연산이 성공했음을 확인하고 최종 커밋을 준비하는 단계입니다.
 
; 3. 완료 (Committed)
: 트랜잭션의 모든 연산이 성공적으로 완료되어, 변경 내용이 데이터베이스에 영구적으로 저장된 상태입니다. COMMIT 연산을 통해 이 상태가 됩니다.
 
; 4. 실패 (Failed)
: 하드웨어 고장, 데이터 무결성 제약조건 위반 등 여러 이유로 트랜잭션의 실행이 중단된 상태입니다.


* '''COMMIT''' : 트랜잭션의 모든 작업을 성공적으로 완료하고, 변경된 내용을 데이터베이스에 영구적으로 반영합니다.
; 5. 철회 (Aborted)
* '''ROLLBACK''' : 트랜잭션의 모든 작업을 취소하고, 트랜잭션이 시작되기 이전 상태로 되돌립니다.
: 트랜잭션이 실패하여 실행 이전의 상태로 모든 작업을 되돌린(ROLLBACK) 상태입니다. 트랜잭션이 비정상적으로 종료되었음을 의미합니다.
* '''SAVEPOINT''' : 트랜잭션 내에 중간 저장 지점을 만들어, 특정 지점까지만 롤백할 수 있도록 합니다.


----
----


=== 💡 개발자 핵심 Point ===
== 트랜잭션 제어 언어 (TCL) ==
사용자는 SQL의 트랜잭션 제어 언어(TCL)를 통해 트랜잭션을 직접 제어할 수 있습니다.
 
*  `COMMIT`: 모든 작업을 최종적으로 데이터베이스에 반영합니다.
*  `ROLLBACK`: 진행된 모든 작업을 취소하고 트랜잭션 이전 상태로 되돌립니다.
*  `SAVEPOINT`: 트랜잭션 내에 중간 저장 지점을 만들어, 특정 지점까지만 롤백할 수 있도록 합니다.


* 트랜잭션은 '''데이터의 정합성이 매우 중요한''' 금융, 결제, 예약 시스템 등에서 필수적인 개념입니다.
</div>
* 여러 사용자가 동시에 데이터에 접근하는 환경에서는, 트랜잭션의 '''고립성 수준(Isolation Level)'''을 어떻게 설정하느냐에 따라 성능과 데이터 일관성 사이의 트레이드오프가 발생합니다.
* Spring 프레임워크에서는 `@Transactional` 어노테이션을 사용하여, 메서드 전체를 하나의 트랜잭션으로 묶는 선언적 트랜잭션 관리를 매우 쉽게 할 수 있습니다.
* 데이터베이스의 '''잠금(Lock)''' 메커니즘은 트랜잭션의 고립성을 보장하기 위한 핵심 기술이며, 교착 상태(Deadlock)의 원인이 되기도 하므로 동작 원리를 이해하는 것이 중요합니다.

2025년 9월 11일 (목) 17:01 기준 최신판

트랜잭션 (Transaction)

← 목록으로 돌아가기

트랜잭션은 데이터베이스의 상태를 변화시키기 위해 수행하는 논리적인 작업의 단위입니다.

하나의 트랜잭션은 한 개 이상의 SQL 쿼리(INSERT, DELETE, UPDATE 등)를 포함할 수 있습니다. 예를 들어, '계좌 이체'라는 하나의 논리적 작업을 위해 'A 계좌 잔액 차감'과 'B 계좌 잔액 증가'라는 두 개의 쿼리가 실행되어야 합니다. 데이터베이스는 이 두 쿼리를 하나의 트랜잭션, 즉 쪼갤 수 없는 작업 단위로 묶어 데이터의 무결성과 일관성을 보장합니다.


트랜잭션이 필요한 이유

만약 트랜잭션이라는 개념이 없다면, 'A 계좌 잔액 차감'에는 성공했지만, 그 직후 시스템 장애로 'B 계좌 잔액 증가'에는 실패하는 상황이 발생할 수 있습니다. 이 경우 A의 돈은 사라졌지만 B에게는 전달되지 않아 데이터의 정합성이 깨지는 심각한 문제가 발생합니다. 트랜잭션은 이와 같은 문제를 방지하고 데이터베이스를 항상 신뢰할 수 있는 상태로 유지하기 위해 반드시 필요합니다.


트랜잭션의 핵심 속성: ACID

신뢰할 수 있는 트랜잭션은 반드시 4가지 핵심 속성을 만족해야 하며, 이를 **ACID**라고 부릅니다.

  • **원자성 (Atomicity):** 트랜잭션의 모든 작업이 전부 성공하거나, 전부 실패해야 합니다.
  • **일관성 (Consistency):** 트랜잭션 실행 후에도 데이터베이스는 항상 일관된 상태를 유지해야 합니다.
  • **고립성 (Isolation):** 하나의 트랜잭션은 다른 트랜잭션의 영향을 받지 않고 독립적으로 실행되어야 합니다.
  • **지속성 (Durability):** 성공한 트랜잭션의 결과는 영구적으로 저장되어야 합니다.

각 속성에 대한 자세한 설명은 아래 링크를 참고하세요.


트랜잭션의 상태 변화

트랜잭션은 실행 과정에서 다음과 같은 5가지 상태를 거칩니다.

1. 활동 (Active)
트랜잭션이 실행을 시작하여 현재 실행 중인 상태입니다. 연산들이 정상적으로 실행되고 있는 동안 이 상태를 유지합니다.
2. 부분 완료 (Partially Committed)
트랜잭션의 마지막 연산까지 모두 실행했지만, 아직 데이터베이스에 최종적으로 변경 내용을 반영하지는(COMMIT) 않은 상태입니다. 모든 연산이 성공했음을 확인하고 최종 커밋을 준비하는 단계입니다.
3. 완료 (Committed)
트랜잭션의 모든 연산이 성공적으로 완료되어, 변경 내용이 데이터베이스에 영구적으로 저장된 상태입니다. COMMIT 연산을 통해 이 상태가 됩니다.
4. 실패 (Failed)
하드웨어 고장, 데이터 무결성 제약조건 위반 등 여러 이유로 트랜잭션의 실행이 중단된 상태입니다.
5. 철회 (Aborted)
트랜잭션이 실패하여 실행 이전의 상태로 모든 작업을 되돌린(ROLLBACK) 상태입니다. 트랜잭션이 비정상적으로 종료되었음을 의미합니다.

트랜잭션 제어 언어 (TCL)

사용자는 SQL의 트랜잭션 제어 언어(TCL)를 통해 트랜잭션을 직접 제어할 수 있습니다.

  • `COMMIT`: 모든 작업을 최종적으로 데이터베이스에 반영합니다.
  • `ROLLBACK`: 진행된 모든 작업을 취소하고 트랜잭션 이전 상태로 되돌립니다.
  • `SAVEPOINT`: 트랜잭션 내에 중간 저장 지점을 만들어, 특정 지점까지만 롤백할 수 있도록 합니다.