Spring DB : 트랜잭션 개념
- Spring/Spring DB
- 2022. 4. 28.
이 글은 인프런 김영한님의 강의를 복습하며 작성한 글입니다.
우리는 데이터 저장을 위해 트랜잭션을 쓴다
우리는 많은 데이터를 굳이 DB에 저장한다. 파일로 만들어 저장해도 되는데, 굳이 DB에 만들어 저장하는 이유는 무엇일까? 가장 큰 이유는 DB가 '트랜잭션' 개념을 지원하기 때문이다. 그렇다면 트랜잭션이 어떤 것일까?
트랜잭션이란?
트랜잭션은 '거래'를 의미한다. 트랜잭션은 하나의 '거래'를 안전하게 처리하도록 보장해준다는 것을 의미한다. DB는 '트랜잭션을 지원한다'라고 했다. 이 말을 풀어서 설명하면 'DB는 하나의 거래가 안전하게 처리하도록 보장한다'로 풀어쓸 수 있다.
다음의 예시를 생각해보자. 이 예시는 A에서 B로 5000원을 이체시키는 경우다. 이 하나의 일이 이루어지기 위해서는 크게 두 가지 작업이 이루어져야한다.
- A의 잔고를 5천원 감소시킨다.
- B의 잔고를 5천원 증가시킨다.
이 때 5천원을 계좌이체 하기 위해서는 위 두 가지 작업이 모두 성공이 되어야 한다. 여러가지 작업을 하나의 일처럼 성공하는 개념을 트랜잭션으로 이해할 수 있다.
만약 두 가지 작업이 하나의 일처럼 이루어지지 않을 경우 어떤 문제가 발생할 수 있을까? 예를 들어 작업 1은 성공했으나, 작업 2가 실패한 경우 엄한 A의 잔고만 5천원 감소된다. 5천원은 공중으로 사라지게 된다. 즉, 두 작업이 동시에 성공해야만 하나의 일이 성공할 수 있다.
그렇다면 하나의 작업이 실패하는 경우는 어떻게 해야할까? 하나의 작업이라도 실패하면 전체의 작업을 멈추고, 트랜잭션(거래)가 시작되기 이전의 상태로 돌리면 된다. '트랜잭션'이라는 이름에는 여러가지 작업이 하나의 일로 동시에 성공하거나, 동시에 실패해서 처음의 상태로 돌아간다는 의미를 내포하는 것으로 이해할 수 있다.
트랜잭션의 ACID
트랜잭션 ACID는 트랜잭션이 가져야만 하는 특성이다.
- 원자성(Atomic) : 트랜잭션 내에서 발생한 작업은 동시에 성공하거나, 동시에 실패해야한다. 즉, 하나처럼 동작한다.
- 일관성(Cosistency) : 모든 트랜잭션은 일관성 있는 DB 상태를 유지한다. DB가 정한 무결성 제약조건을 유지해야함.
- 격리성(Isolation) : 동시에 실행되는 트랜잭션이 서로의 트랜잭션에 영향을 미치지 않아야한다.
- 지속성(Durability) : 트랜잭션이 성공하면 그 결과는 항상 기록되어야 한다.
위의 네 가지 특성 중 원자성 / 일관성 / 지속성은 기본적으로 지켜진다. 그렇지만 트랜잭션의 격리성은 그렇지 않다. 트랜잭션의 격리성은 개발자가 잘 신경을 써줘야한다.
트랜잭션의 격리성은 동시성 / 병렬성과 관련지어 생각할 수 있다. 트랜잭션의 격리 수준이 증가하면 병렬 / 동시성은 줄어드는 반면에 데이터의 정합성은 증가한다. 반면 트랜잭션의 격리 수준을 낮추는 방향도 있는데, 이 경우 병렬 / 동시성은 극대화 되지만 데이터의 정합성은 매우 떨어질 가능성이 높아진다.
트랜잭션 격리 수준
- READ UNCOMMITTED : 커밋되지 않은 읽기
- READ COMMITTED : 커밋된 것만 읽기
- REPEATABLE READ : 반복가능한 읽기
- SERIALIZABLE : 직렬화 가능
트랜잭션 격리 수준은 위 4가지로 구분이 된다. READ UNCOMMITED가 가장 낮은 격리 수준을 보여주고, SERIALIZABLE은 가장 높은 격리 수준을 보여준다. 트랜잭션 격리 수준과 이에 따른 문제점 등은 아래 게시글에서 자세히 정리했다.
'Spring > Spring DB' 카테고리의 다른 글
Spring DB : DB 트랜잭션의 이해 (1) (0) | 2022.04.28 |
---|---|
Spring DB : 데이터베이스 연결 구조와 DB 세션 (0) | 2022.04.28 |
Spring DB : DataSource 적용 (0) | 2022.04.28 |
Spring DB : DataSource 이해 (0) | 2022.04.28 |
Spring DB : 커넥션 풀 (0) | 2022.04.28 |