Transaction 본문
🎬Transaction?
Transaction 이란?
여러 읽기 쓰기 단위를 논리적으로 하나로 묶은 것을 의미한다
트랜잭션이 시작되면 한 개 이상의 쿼리가 실행되고 결과를 커밋하여 DB에 반영하거나 롤백하여 반영을 취소한다
🎞Transaction의 범위
Transaction의 범위는 Connection을 기준으로 한다
위의 그림을 예시로 들었을 때, Connection_01에서 Rollback이 발생하더라도 Connection_02에서 수행된 Transaction은 이미 Commit이 되었기 때문에 Connection_02에서 발생한 Tx의 결과는 Rollback이 되지 않는다
🎇Transaction Propagation
위와 같은 문제를 해결하기 위해 나온 것이 바로 트랜잭션 전파다
여러 메소드 호출이 한 트랜잭션으로 묶이도록 하기 위해 필요
Spring의 경우 메소드 간에 커넥션 객체를 전달하지 않아도 한 트랜잭션으로 묶어서 실행시킨다
🧙♂️Race Condition
경쟁 상태 - 여러 Transaction이 동시에 같은 자원에 접근할 때 발생할 수 있는 문제점
🧙♂️Race Condition을 해결할 수 있는 방법들
Transaction Isolation (트랜잭션 격리)
가장 손쉽게 경쟁 상태를 해결할 수 있는 방법은 트랜잭션을 격리하는 것이다.
트랜잭션을 서로 완전히 격리하여 순서대로 실행하는 것으로 다른 트랜잭션에 아예 영향을 미칠 수 없도록 한다.
이 경우, 동시 접근 문제가 아예 발생하지 않지만 트랜잭션을 완전히 격리시켜 순차적으로 실행할 경우 한 번에 한 개의 트랜잭션만 처리할 수 있게 되므로 처리량이 저하된다.
모든 트랜잭션을 완전히 격리시킬 경우 처리량이 심각하게 저하되기 때문에 RDB들은 완전한 격리 외에도 다양한 트랜잭션 격리 수준을 제공한다.
😿동시성과 관련된 다양한 문제들
Read Committed 격리 수준으로 해결할 수 있는 문제들
Dirty Read : 커밋되지 않는 데이터 읽기
Dirty Write : 커밋되지 않은 데이터 덮어쓰기
- 커밋된 값과 트랜잭션 진행 중인 값을 별도로 보관하여 커밋된 데이터만 읽을 수 있도록 한다
- 행 단위 잠금을 사용하여 같은 데이터를 수정한 트랜잭션이 끝날 때까지 대기하도록 하여 커밋된 데이터만 덮어쓰기 가능하도록 함
Repeatable Read 격리 수준으로 해결할수 있는 문제들
Read Skew : 읽는 동안 데이터 변경
- 트랜잭션 동안 같은 데이터만 읽도록 한다
- MVCC (Multi-Version Concurrency Control) : 읽는 시점에 특정 버전에 해당하는 데이터만 읽도록 한다
Lost Update
변경 유실은 count 증가 혹은 위키의 페이지 수정 등 동일한 데이터를 사용할 때 발생한다
해결 방안
- 원자적 연산 사용
- DB가 지원하는 원자적 연산을 사용하여 동시 수정에 대해 DB가 순차적으로 처리하도록 한다
update article set readcnt = readcnt + 1 where id =:id
- 명시적 잠금
- 조회할 때 수정할 행을 미리 잠금
select ... for update
- CAS (Compare And Set)
- 수정할 때 값이 같은지 비교하여 같은 경우에만 실제 변경이 발생하도록 한다
update wikipage set ver=2, ... where id=:id and ver = 1
읽는 동안 데이터 변경, 동일한 트랜잭션에는 영향이 없지만 다른 트랜잭션에 영향을 미치는 경우
- 한 트랜잭션의 결과가 다른 트랜잭션의 쿼리 결과에 영향을 주는 경우 같은 데이터를 사용하지 않았지만 경쟁 상태에 놓이게 되는 경우가 발생한다
😿 Read Uncommitted & Serializable
Read Uncommitted 의 경우 사실상 사용하지 않고, Serializable 이 의미하는 것은 트랜잭션을 순차적으로 처리하는 것이지만, 이는 성능에 매우 악영향을 끼치기 때문에 실질적으로는 인덱스 잠금이나 조건 기반 잠금 등을 사용한다
https://youtu.be/urpF7jwVNWs?si=EMX3SrOxcylUKXsH
https://youtu.be/poyjLx-LOEU?si=7RIQlg92ZAAJeJJe
'Dev' 카테고리의 다른 글
3/4-way Handshake 란? (0) | 2024.02.25 |
---|---|
HTTP (1) | 2024.02.24 |
Spring Security Session 과 RestAPI (0) | 2023.08.17 |
In-Memory NoSQL DBMS Redis (0) | 2023.06.18 |
JVM Runtime Data Area Structure (1) | 2023.05.08 |