트랜잭션
데이터베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위.
즉, 여러 개의 쿼리들을 하나로 묶는 단위를 말한다.
트랜잭션의 특징(ACID)
원자성(Atomicity)
트랜잭션과 관련된 일이 모두 수행되었거나 전혀 수행되지 않았음을 보장하는 특징 -> All or Nothing
이에 따라 트랜잭션이 부분적으로 수행되거나 중단되지 않는다.
예시) 지금 이체는 성공(All)할 수도, 실패(Nothing)할 수도 있지만 보내는 쪽의 출금 작업만 성공하고 받는 쪽의 입금 작업을 실패해서는 안된다.
참고) 원자는 불가분하고 분할할 수 없는 입자
트랜잭션의 조작 중 일부가 실패하면, 원자성의 개념에 따라 이전 상태로 롤백되어야 한다. 이 점이 마치 원자가 분할되지 않고 그 자체로 존재하는 것처럼, 트랜잭션의 변경은 모두 반영되거나 전혀 반영되지 않아야 한다. 중간 단계로의 일시적인 상태는 허용되지 않음 - Chat GPT
커밋과 롤백

커밋은 여러 쿼리가 성공적으로 처리되었음을 확정하는 명령어이다. 트랜잭션 단위로 수행되며 변경된 내용이 모두 영구적으로 저장되는 것을 말한다.
커밋이 수행되었다 == 트랜잭션이 성공적으로 수행되었다.

롤백은 트랜잭션으로 처리한 하나의 묶음 과정을 처리 이전으로 돌리는 일을 말한다.
트랜잭션 전파(Transaction Propagation)
여러 트랜잭션 관련 메서드의 호출을 하나의 트랜잭션의 묶이도록 하는 것.
Spring에서는 @Transactional 애노테이션을 통해 트랜잭션 전파를 설정한다. 일련의 작업들을 묶어서 하나의 단위로 처리하고 싶다면 @Transactional을 활용하자.
참고) https://tecoble.techcourse.co.kr/post/2021-05-25-transactional/
일관성(Consistency)
트랜잭션이 실행되기 전과 후 모두 데이터베이스의 일관성이 유지되어야 함을 의미한다.
이를 위해 허용된 방식으로만 데이터를 변경해야 한다. 즉, 데이터베이스에 기록된 모든 데이터는 여러 가지 조건, 규칙에 따라 유효함을 가져한다는 것이다.
예시) 잔고가 0원인 형석이가 100만원을 송금하는 것은 허용되지 않는다.
독립성, 격리성(Isolation)
동시에 실행되는 여러 트랜잭션들이 서로 영향을 미치지 않도록 격리되어야 함을 의미한다. 이를 위해 트랜잭션의 실행은 공식적으로 순차적이어야 하지만, 성능관련 이유로 인해 격리 수준을 조절하는 것이 가능하다.
격리 수준에 따라 발생하는 현상
팬텀 리드(Phantom read)
한 트랜잭션 내에서 동일한 쿼리를 보냈을 때 조회 결과가 다른 경우.
새로운 레코드가 삽입되면 동일한 쿼리를 다시 보냈을 때 조회 결과 달라진다. -> 팬텀 리드
반복 가능하지 않은 조회(non-repeatable read)
한 트랜잭션 내의 같은 행에 두 번 이상 조회가 발생했을 때, 값이 다른 경우.
값을 이미 조회한 행의 값이 다른 트랜잭션에 의해 변경되었을 때 재조회한 경우 -> 반복 가능하지 않은 조회
반복 가능하지 않은 조회는 행 값이 달라질 수도 있는데, 팬텀 리드는 다른 행이 선택될 수도 있다는 점에서 차이를 보인다.
더티 리드(dirty read)
한 트랜잭션이 아직 커밋되지 않은 다른 트랜잭션의 변경 내용을 읽는 현상.
위 현상은 모두 데이터의 일관성을 저해할 수 있다.
격리 수준(Isolation Level)

격리성의 정도가 엄격한 순으로 격리 수준을 알아보자
SERIALIZABLE(직렬화 가능)
트랜잭션을 순차적으로 진행시킴. 여러 트랜잭션이 동시에 같은 row에 접근할 수없다.
동시성 제어를 엄격하게 수행하여 트랜잭션 간 간섭을 완전히 방지한다. 따라서 Dirty Read, Non-Repeatable-Read, Phantom Read가 발생하지 않지만, 성능저하가 발생할 수 있다.
REPEATABLE_READ(반복 가능한 읽기) (MySQL default)
하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없도록 막아줌. 단, 새로운 행을 추가하는 것은 막지 않음.
이를 통해 한 트랜잭션 내에서 같은 데이터를 여러 번 읽으면 일관된 값을 보장한다.
Non-Repeatable-Read는 방지하지만 Phantom Read가 발생할 수 있다.
READ_COMMITTED(커밋된 읽기 허용)
가장 많이 사용되는 격리 수준. 다른 트랜잭션이 커밋하지 않은 정보는 읽을 수 없다. 즉, 커밋 완료된 데이터에 대해서만 조회를 허용한다.
어떤 트랜잭션이 접근한 행을 다른 트랜잭션이 수정할 수 있다. 예시) 트랜잭션 A가 수정한 행을 트랜잭션 B가 수정할 수 있음. 따라서 트랜잭션 A가 같은 행을 다시 읽을 때 다른 내용이 발견될 수 있다.
Dirty Read는 방지하지만 Non-Repeatable-Read와 Phantom Read가 발생할 수 있다.
READ_UNCOMMITTED(커밋되지 않은 읽기 허용)
다른 트랜잭션이 커밋하지 않은 정보까지 읽을 수 있다. 데이터 무결성을 위해 일반적으로 사용하지 않는 것이 이상적이다.
Dirty Read, Non-Repeatable-Read, Phantom Read가 발생할 수 있다.
지속성(Durability)
트랜잭션이 성공적으로 커밋되면 그 결과는 영원히 반영되어야 하는 것을 의미하는 특징.
시스템 장애 등의 예외상황이 발생하더라도 트랜잭션의 결과는 보존되어야 한다.
데이터베이스는 이를 위해 체크섬, 저널링, 롤백 등의 기능 제공
체크섬
중복 검사의 한 형태. 오류 정정을 통해 송신된 데이터의 무결성을 보호한다.
저널링
파일 시스템, DB시스템에 변경 사항을 커밋하기 전 변경 사항에 대한 로깅하는 것.
'Computer Science > DB' 카테고리의 다른 글
| [데이터베이스] 조인(JOIN) (0) | 2023.05.31 |
|---|---|
| [데이터베이스] 엔터티(entity)와 릴레이션(relation) (0) | 2023.05.17 |
| Crow's foot notation이란? (0) | 2021.07.01 |