트랜잭션
•
데이터 베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위
•
데이터 베이스에 접근하는 방법은 쿼리, 즉 여러개의 쿼리들을 하나로 묶는 단위
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)하기 전에 로깅하는 것, 트랜잭션 등 변경 사항에 대한 로그를 남기는