트랜잭션 Transaction
✔️트랜잭션이란?
데이터베이스의 상태를 변화시키는 하나의 논리적 기능을 구성하는 일련의 연산들의 집합을 의미한다.
(데이터 베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위를 말하며 데이터베이스에 접근하는 방법은 쿼리이므로, 즉 여러 개의 쿼리들을 하나로 묶는 단위를 말합니다. )
SQL 쿼리(SELECT, UPDATE, INSERT, DELETE와 같은 연산)을 수행하며 데이터베이스의 상태를 변화시킨다.
✔️트랜잭션의 목적
사용자가 데이터베이스의 무결성(Integrity) 유지를 확신하게 해준다. (보장해준다.)
✔️트랜잭션의 특징 - ACID
- Atomicity 원자성
- 트랜잭션 내의 모든 명령은 반드시 완벽히 수행되어야 한다.(부분적으로 실행되거나 중단되지 않는것을 보장)
- 어느 하나라도 오류가 발생하면 트랜잭션 전부가 취소된다.
- 모두 실패해서 Rollback 되거나, 모두 성공해서 Commit 이 된다.(all or nothing)
- 트랜잭션 전파
- Consistency 일관성 : 허용된 방식으로만 데이터를 변경해야 하는 것
- 트랜잭션의 작업 처리 결과는 항상 일관성을 유지해야 한다.
- 데이터베이스에서 정한 무결성 제약 조건을 만족해야 한다.
- Isolation 격리성, 독립성
- 트랜잭션 수행 시 서로 끼어들지 못하는 것
- 복수의 병렬 트랜잭션은 서로 격리되어 마치 순차적으로 실행되는 것처럼 작동되어야 하고, 데이터베이스는 여러 사용자가 같은 데이터에 접근할 수 있어야 합니다.
- 수행 중인 트랜잭션은 완전히 완료될 때까지 다른 트랜잭션의 수행 결과를 참조할 수 없다.
- 트랜잭션 격리 수준을 선택할 수 있다. => 격리성 보장
- Durability 지속성
- 성공적으로 완료된 트랜잭션의 결과는 시스템이 고장 나더라도 영구적으로 반영되어야 한다.
(중간에 시스템에 문제가 발생해도 데이터베이스 로그 등을 사용해서 성공한 트랜잭션 내용을 복구할 수 있다.)
✔️트랜잭션의 상태
- Active 활동 : 트랜잭션이 실행 중인 상태
- Failed 실패 : 트랜잭션 실행에 오류가 발생하여 중단된 상태
- Aborted 취소 : 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태
- Partially Committed 부분완료 : 트랜잭션의 마지막 연산까지 실행했지만, Commit 연산이 실행되기 직전의 상태
- Committed 완료 : 트랜잭션이 성공적으로 종료되어 Commit 연산을 실행한 후의 상태
✔️트랜잭션의 기능
=> 데이터의 무결성이 보장됩니다. 또한, 데이터 변경 전에 변경 사항을 쉽게 확인할 수 있고 해당 작업을 그룹화할 수 있습니다.
Commit : 여러 쿼리가 성공적으로 처리되었다고 확정하는 명령어; 트랜잭션 단위로 수행되며 변경된 내용이 모두 영구적으로 저장되는 것을 말합니다.
- 커밋이 수행되었다 === 하나의 트랜잭션이 성공적으로 수행되었다.
- 하나의 트랜잭션이 성공적으로 끝나서 데이터베이스가 일관성 있는 상태에 있음을 의미하는 연산이다.
- commit을 호출하기 전까지는 이전 데이터가 임시로 저장되어 있기 때문에, 해당 트랜잭션을 시작한 세션(사용자)에게만 변경 데이터가 보이고, 다른 세션에게는 보이지 않습니다.
Rollback: 트랜잭션으로 처리한 하나의 묶음 과정을 일어나기 전으로 돌리는 일(취소)을 말합니다.
- 하나의 트랜잭션 처리가 실패돼서 트랜잭션의 원자성이 깨진 상태를 의미하는 연산이다.
- 원자성을 지키기 위해 실행한 모든 연산을 취소(Undo)해야한다.
트랜잭션 전파란? 여러 트랜잭션 관련 메서드의 호출을 하나의 트랜잭션에 묶이도록 하는 것
✔️ 요약
—
➕트랜잭션 격리 수준 Isolation Level
트랜잭션 격리 수준이란?
트랜잭션들끼리 일관성 있는 데이터를 얼마나 허용할 것인지 정해놓은 수준이다.
격리 수준에 따라 발생하는 현상
- Dirty Read : 한 트랜잭션 내에서 동일한 쿼리를 보냈을 때 해당 조회 결과가 다른 경우를 말합니다.
- Non Repeatable Read : 어떤 트랜잭션이 같은 쿼리를 2번 실행하는데 ( 그 사이에 다른 트랜잭션이 수정/삭제를 하여) 같은 쿼리에 다른 값이 나오는 경우
- Phantom Read :한 트랜잭션 내에서 동일한 쿼리를 보냈을 때 해당 조회 결과가 다른 경우
트랜잭션 격리 수준의 종류 => 레벨 올라갈수록 격리성 강해진다. 동시성 약해진다.
- READ uncommitted (LEVEL 0) => 팬텀리드, 반복 가능하지 않은 조회, 더티 리드 발생
- READ committed (LEVEL 1) => 팬텀 리드, 반복 가능하지 않은 조회 발생
- REPEATABLE READ (LEVEL 2) => 팬텀리드 발생
- SERIALIZABLE (LEVEL 3)
➕ 트랜잭션 전파
여러 트랙잭션 관련 메서드의 호출을 하나의 트랜잭션에 묶이도록 하는 것을 말합니다.
Spring 프레임워크에서는 @Transactional annotation을 통해 여러 쿼리 관련 코드들을 트랜잭션으로 처리합니다.