본문 바로가기
Spring/Spring DB

트랜잭션

by YellowCow 2025. 7. 18.

개념

작업의 단위

 

등장배경

은행에서 A가 B에게 1000원을 이체하려고 할 때 아래의 작업을 거쳐야 한다

1. A의 계좌에서 1000원을 뺀다

2. B의 계좌에 1000원을 더한다

 

만약 1번 작업 처리 후, 2번 작업에서 에러가 발생하면 어떻게 될까?

A의 계좌에서 1000원을 빼는 작업만 수행되고

B의 계좌에는 1000원을 더하는 작업은 수행되지 않아 문제가 될 것이다

 

이러한 문제를 해결하기 위해서 '트랜잭션'이라는 개념이 등장하게 되었다

트랜잭션은 비지니스 로직인 1, 2번 작업을 하나의 작업으로 묶어주는 기법이다

 

트랜잭션이 적용될 경우,

예를 들어, 1번이 성공하더라도 2번 작업에서 실패하면 작업의 결과가 반영되지 않는다

작업 1, 2번은 하나의 작업이기 때문에 전체가 반영되거나 반영되지 않음을 보장한다

 

트랜잭션의 특성

ACID

트랜잭션은 아래와 같이 ACID라는 특성을 보장한다

- Atomicity(원자성): 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공 하거나 모두 실패해야 한다.

- Consistency(일관성): 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다. 예를 들어 데이터베이스에서 정한 무결성 제약 조건을 항상 만족해야 한다.

- Isolation(격리성): 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리한다. 예를 들어 동시에 같은 데이터

수정하지 못하도록 해야 한다. 격리성은 동시성과 관련된 성능 이슈로 인해 트랜잭션 격리 수준(Isolation

level) 선택할 있다.

- Durability(지속성): 트랜잭션을 성공적으로 끝내면 결과가 항상 기록되어야 한다. 중간에 시스템에 문제가 발생해도 데이

터베이스 로그 등을 사용해서 성공한 트랜잭션 내용을 복구해야 한다.

 

Isolation Level

트랜잭션의 Isolation 수준은 아래와 같이 존재한다

트랜잭션 격리 수준 - Isolation level

- READ UNCOMMITED(커밋되지 않은 읽기): 커밋되지 않은 내용을 다른 세션의 사용자가 읽을 수 있다

- READ COMMITTED(커밋된 읽기): 커밋된 내용만 다른 세션의 사용자가 읽을 수 있다

- REPEATABLE READ(반복 가능한 읽기): 사용자 A가 트랜잭션을 먼저 시작하고 B가 A보다 나중에 트랜잭션을 시작하여 값을 변경하여 커밋했을 경우, A는 트랜잭션을 종료할 때까지 B가 값을 변경하기 전의 값을 읽어온다

- SERIALIZABLE(직렬화 가능): 모든 트랜잭션에 대해 순차적으로 처리한다. 어떠한 데이터 부정합 문제도 발생하지 않는다. 하지만 트랜잭션이 순차적으로 처리되어야 하므로 동시 처리 성능이 매우 떨어진다.

 

'Spring > Spring DB' 카테고리의 다른 글

문제해결 - 트랜잭션 처리 코드 반복 문제  (0) 2025.07.19
DB Lock  (0) 2025.07.18
DB Connection  (0) 2025.07.18
DataSource  (0) 2025.07.17
Connection Pool  (0) 2025.07.16

댓글