트랜잭션
- 데이터 베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위
- 데이터 베이스에 접근하는 방법은 쿼리, 즉 여러개의 쿼리들을 하나로 묶는 단위
ACID
- 원자성 (Atomicity)
- all or nothing
- 트랜잭션과 관련된 일이 모두 수행되었거나 되지 않았거나를 보장하는 특징
- 트랜잭션 커밋 시 문제 발생하여 롤백하는 경우에 해당
- 외부 API를 호출하는 경우 롤백이 일어났을 때 어떻게 해야 할 것인지 따로 해결 방법을 마련해야 함
- 커밋과 롤백
- 트랜잭션 전파
- 일관성 (Consistency)
- 독립성, 격리성 (Isolation)
- 트랜잭션 수행 시 서로 끼어들지 못하는 것
- 여러 개의 격리 수준으로 나누어 보장
-
READ_UNCOMMITTED
- 무결성 보장 x, 거대한 양의 데이터를 어림잡아 집계하는 곳에 사용
- 가장 낮은 격리수준으로 다른 트랜잭션에서 commit되지 않은 상태의 데이터까지 읽어온다. (Dirty read)
-
READ_COMMITTED
- 가장 많이 사용되는 격리 수준, PostgreSQL, SQL Server, 오라클에서 기본값으로 사용
- 커밋 완료된 데이터에 대해서만 조회를 허용
- 트랜잭션이 접근한 행을 다른 트랜잭션이 수정 가능
- UNCOMMITTED와 반대로 commit된 내용만 읽어온다. 하지만 트랜잭션들이 동시에 수행되고 있다면 commit 이후의 데이터가 다른 동시성 문제가 발생할 수 있다.
(Nonrepeatable read)
-
REPEATABLE_READ
- 하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없도록 막아주지만 새로운 행을 추가하는 것은 막지 않음
- 하나의 트랜잭션에 하나의 스냅샷을 이용하기 때문에 READ_COMMITTED와 같은 문제가 발생하지 않지만 다시 데이터를 조회하는 과정에서 새로 추가되거나 제거된 값을 가져올 수 있다. (Phantom read)
-
SERIALIZABLE
- 말 그대로 순차적으로 진행, 여러 트랜잭션이 동시에 같은 행 접근 불가
- 가장 높은 격리수준으로 READ시에 DML 작업이 불가능하기 때문에 동시성이 낮다.
※ DML작업 : Data Manipulation Language는 데이터베이스에서 데이터를 조작하는데 사용되는 언어를 의미한다. 주로 SELECT, INSERT, UPDATE, DELETE 등의 SQL 명령어를 포함한다.

-
팬텀 리드
- 한 트랜잭션 내에서 동일한 쿼리를 보냈을 때 해당 조회 결과가 다른 경우
-
반복 가능하지 않은 조회
- 한 트랜잭션 내의 같은 행에 두번 이상 조회가 발생했는데, 그 값이 다른 경우
-
더티 리드
- 한 트랜잭션이 실행 중일 때 다른 트랜잭션에 의해 수정되었지만 아직 ‘커밋되지 않은’ 행의 데이터를 읽을 수 있을 때 발생
- 지속성 (Durability)
- 성공적으로 수행된 트랜잭션은 영원히 반영되어야 하는 것
- 시스템 장애가 발생해도 원래 상태로 복구하는 회복 기능이 있어야 함
- 데이터베이스는 이를 위해 체크섬, 저널링, 롤백 등의 기능을 제공
- 체크섬
- 중복 검사의 한 형태로, 오류 정정을 통해 송신된 자료의 무결성을 보호하는 단순한 방법
- 저널링
- 파일 시스템 또는 데이터베이스 시스템에 변경 사항을 반영(commit)하기 전에 로깅하는 것, 트랜잭션 등 변경 사항에 대한 로그를 남기는
지명님이 만드신 트랜잭션
@Transactional