트랜잭션(transaction)
하나의 논리적 기능을 수행하기 위한 작업의 단위
▷ 여러 개의 쿼리(DB에 접근하는 방법)를 하나로 묶는 단위
특징
1. 원자성(atomicity)
▷ 트랜잭션과 관련된 일이 모두 수행되었거나 되지 않았거나를 보장하는 특징
"all or nothing"
→ 커밋("all")과 롤백("nothing")의 역할
- 데이터의 무결성 보장
- 데이터 변경 전 변경사항 확인 용이
- 해당 작업 그룹화 가능
- 커밋(commit)
여러 쿼리가 성공적으로 처리되었다고 확정하는 명령어
= 하나의 트랜잭션 수행 성공
- 롤백(roll back)
트랜잭션으로 처리한 과정을 취소
※ 트랜잭션 전파: 트랜잭션(커넥션 단위)을 커넥션 객체를 넘겨 수행할 때,
매번 넘기지 않고, 여러 트랜잭션 관련 메서드의 호출을 하나의 트랜잭션에 묶는 것

ex) 은행 업무에서 롤백시, 삭제만 롤백되고 삽입은 그대로
2. 일관성(consistency)
▷ '허용된 방식'으로만 데이터를 변경해야 한다.
ex) 은행 업무에서 잔액 이상으로 삭제 불가
3. 격리성(isolation)
▷ 트랜잭션 수행 시 서로 끼어들지 못한다.
동시성과 상반되는 개념
→ 격리 수준에 따른 발생 현상
(1) 팬텀 리드(phantom read)
- 한 트랜잭션 내에서 동일한 쿼리를 보냈을 때, 조회 결과가 다른 경우
- 다른 행이 선택될 수 있음
ex) A가 조회(19세 이상: 3table) → B가 레코드 삽입(30살) → 결과 변경(19세 이상: 4table)
(2) 반복 가능하지 않은 조회(non-repeatable read)
- 한 트랜잭션 내의 같은 행에 두 번 이상 조회 시, 결과가 각각 다른 경우
- 행 값이 달라질 수 있음
ex) A가 조회(준희 나이:26) → B가 변경(준희 나이:24) → A가 조회(준희 나이:24)
(3) 더티 리드(dirty read)
- 한 트랜잭션이 실행 중일 때, 다른 트랜잭션이 수정중이나 커밋하지 않은 행의 데이터를 읽는 경우
- "커밋 되지 않은"
ex)A가 조회(준희 나이:26) → B가 변경 중→ A가 조회(준희 나이:24)
→ 격리 수준
(1) SERIALIZABLE
- 격리 정도: 순차적 진행, 여러 트랜잭션이 동시에 같은 행에 접근 불가
- 한계: 격리성은 높으나, 교착 상태가 일어날 확률이 높고 성능이 떨어짐
- 발생 현상: x
(2) REPEATABLE_READ
- 격리 정도: 하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정 불가
- 한계: 새로운 행은 추가 가능하므로, 이후에 추가된 행이 발견될 수 있음
- 발생 현상: 팬텀리드
(3) READ_COMMITTED(사용 多)
- 격리 정도: 커밋 완료된 데이터만 조회 가능
- 한계: 어떤 트랜잭션이 접근한 행을 다른 트랜잭션이 수정할 수 있음
ex) A가 수정한 행을 B가 수정해, A가 다시 읽을 때, 다른 내용 발견
- 발생 현상: 팬텀리드, 반복 불가한 조회
(4) READ_UNCOMMITTED
- 격리 정도: 무결성을 위해함(하나의 트랜잭션이 커밋되기 이전에 다른 트랜잭션에 노출)
- 장점: 정확성보다 양이 더 중요한 "어림잡아" 집계할 때 사용하면 ㄱㅊ
- 발생 현상: 팬텀리드, 반복 불가 조회, 더티 리드
4. 지속성(durability)
▷ 성공적으로 수행된 트랜잭션은 영원히 반영된다.
시스템 장애 시, 회복 기능 있어야함.
→ 지속성을 위해 제공하는 기능
- 체크섬
중복 검사의 한 형태, 오류 정정을 통해 송신된 자료의 무결성을 보호하는 단순 방법
- 저널링
파일 시스템 또는 DB 시스템에 변경 사항을 commit하기 전에 로깅하는 것
- 롤백 등등
'일기' 카테고리의 다른 글
join (0) | 2023.02.18 |
---|---|
인덱스 (0) | 2023.02.16 |
[관계 데이터 모델] 제약 조건_릴레이션 키 (0) | 2023.02.10 |
[관계 데이터 모델] 제약 조건 (0) | 2023.02.10 |
[관계 데이터 모델] 구조 (0) | 2023.02.10 |