@Transactionl 에 알아봤다
트랜잭션이란
여러 쿼리를 논리적으로 하나의 작업으로 묶어주는 것
거래가 일어날때의 과정
구매자 계좌에서 만원 출금
판매가 계좌에서 만원 입금
업데이트문 : 구매자 계좌에서 만원 빼기
업데이트문 : 판매자 계좌에서 만원 더하기
구매가 계좌에서 돈이 빠지고 오류가 나면 판매자에 들어가지 않는다
이런 상황을 막기위해 트랜잭션의 개념을 사용한다
쿼리들이 한꺼번에 모두 실행되거나
아예 아무 쿼리도 실행되지 않게 해주는것
트랜잭션은 사용자 혹은 시스템 상의 실수가 있더라도
데이터베이스가 데이터를 안정적으로 보장할 수 있도록 한다
하나의 트랜잭션은 커밋 혹은 롤백 된다
커밋은 확인 도장 모든 쿼리가 성공되어 실제 디비에 반영하는것
롤백은 쿼리실행 결과를 취소하고 디비를 트랜잭션 이전 상태로 돌리는것
트랜잭션의 성질
트랜잭션이 안전하게 수행된다는 것을 보장하기 위한 성질
ACID
A : Atomicity (원자성)
트랜잭션은 DB에 모두 반영되거나 전혀 반영되지 않아야 한다
(= 완료되지 않은 트랜잭션의 중간 상태를 DB에 반영해서는 안된다)
C : Consistency (일관성)
트랜잭션 작업처리 결과는 항상 일관성 있어야 한다
데이터베이스는 항상 일관된 상태로 유지되어야 한다
I : Isolation (독립성)
둘 이상의 트랜잭션이 동시 실행되고 있을때
어떤 트랜잭션도 다른 트랜잭션 연산에 끼어들 수 없다
(= 각각의 트랜잭션은 서로 간섭없이 독립적으로 이루어져야 한다)
D : durability (지속성)
트랜잭션이 성공적으로 완료되었으면 결과는 영구히 반영되어야 한다
하지만 실제로는 성능을 위해 손실 보장이 완화 되기도 한다
동시성을 얻기 위한 한가지 방법으로 트랜잭션 격리 레벨 설정이 있다
트랜잭션 격리 수준
동시에 DB에 접근할 때 그 접근을 어떻게 제어할지에 대한 설정
동시성
READ-UNCOMMITTED
READ-COMMITTED
REPEATABLE_READ
SERIALIZABLE
데이터 정합
밑으로 갈수록 격리 수준이 높아지지만
성능이 떨어진다
READ-UNCOMMITTED
커밋 전의 트랜잭션의 데이터 변경 내용을 다른 트랜잭션이 읽는 것 허용
A가 롤백했는데 B가 그전에 select 하면 더티리드(Dirty Read)가 발생한다
READ-COMMITTED
커밋이 완료된 트랜잭션의 변경사항만 다른 트랜잭션에서 조회 가능
커밋 전이라면 커밋 전 내용을 읽어오고
커밋 후라면 커밋 후 내용을 읽어오게 된다
Non-Repeatable Read
논리피터블 리드 가 일어나는데
같은 트랜잭션 내에서 셀렉트 두번했는데
서로 다른 값이 나오는 데이터 불일치 문제이다
REPEATABLE_READ
트랜잭션 범위 내에서 조회한 내용이 항상 동일함을 보장한다
한번 조회한 데이터는 다른 데이터를 업데이트 하더라도
두번째 조회해도 그전에 조회한 데이터를 얻는다
하지만 Phantom Read가 발생한다
팬텀리드는 논리피터블 리드의 한 종류로서
조건이 걸렸든 안걸렸든 셀렉트문을 쓸 때 나타날수 있는 현상이다
해당 쿼리로 읽히는 데이터를 들어가는 행위
새로 생기거나 없어져 있는 현상이다
SERIALIZABLE
한 트랜잭션에서 사용하는 데이터를 다른 트랜잭션에서 접근 불가
ACID 성질이 엄격하게 지켜지지만 성능이 떨어진다
트랜잭션이 커밋될 때까지 모든 데이터에 잠금이 설정되어
다른 트랜잭션에서 해당 데이터를 변경할 수 없게 된다
| Dirty Read | Non-Repeatable Read | Phantom Read | |
READ-UNCOMMITTED |
O | O | O |
READ-COMMITTED |
X | O | O |
REPEATABLE_READ |
X | X | O |
SERIALIZABLE |
X | X | X |
트랜잭션 전파 타입
트랜잭션의 경계에서 트랜잭션이 어떻게 동작할 것인가
| 진행 중인 트랜잭션 유 | 진행 중인 트랜잭션 무 | |
| REQUIRED | 해당 트랜잭션 사용 | 새로운 트랜잭션 생성 |
| MANDATORY | 해당 트랜잭션 사용 | 예외 발생 |
| REQUIRES_NEW | 해당 트랜잭션 보류, 새로운 트랜잭션 생성 | 새로운 트랜잭션 생성 |
| SUPPORTS | 해당 트랜잭션 사용 | 트랜잭션 없이 진행 |
| NOT_SUPPORTED | 해당 트랜잭션 보류 | 트랜잭션 없이 진행 |
| NEVER | 예외 발생 | 트랜잭션 없이 진행 |
| NESTED | 중첩 트랜잭션 생성 | 새로운 트랜잭션 생 |
결론
스프링 트랜잭션은 앞서 설명한 여러 격리 레벨과 전파타입을 제공하는데
중요한 데이터의 안정성에 관한 설정이므로 케이스에 따라 문제가 발생하지 않도록
각 속성을 잘 이해하고 선택해야한다
'CS' 카테고리의 다른 글
| [CS] 템플릿 메서드 패턴 (0) | 2022.10.15 |
|---|---|
| [CS] 라이브러리 VS 프레임워크 (0) | 2022.10.13 |
| [CS] 인증과 인가 (10분 테코톡) (0) | 2022.10.08 |
| [CS] 매개변수(parameter), 전달인자(argument) (0) | 2022.10.06 |
| [CS] HTTP Status Code (0) | 2022.10.06 |