📌 트랜잭션
- Transactional이란 어노테이션은
데이터베이스의상태를 변경
하는 작업 또는 한번에 수행되어야 하는 연산들을 의미 - 예외 발생 시 rollback 처리를 자동으로 수행해주는 어노테이션
- ACID라 하는 네가지 특성을 가지고 있습니다.
✔️상태를 변경시킨다는 것
= SQL 질의어를 통해 DB에 접근하는 것
-SELECT
-INSERT
-DELETE
-UPDATE
트랜잭션의 4가지 조건(ACID)
- 원자성(Atomicity)
- 한 트랜잭션 내에서 실행한 작업들은 하나의 단위로 처리한다. (모두 성공 또는 모두 실패)
- 트랜잭션이 DB에 모두 반영되거나, 혹은 전혀 반영되지 않아야 된다.
- 일관성(Consistency)
- 트랜잭션은 일관성 있는 데이터베이스 상태를 유지한다. (data integrity 만족 등)
- 트랜잭션의 작업 처리 결과는 항상 일관성 있어야 한다.
- 격리성/독립성/고립성(Isolation)
- 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 격리해야 한다.
- 둘 이상의 트랜잭션이 동시에 병행 실행되고 있을 때,
어떤 트랜잭션도 다른 트랜잭션 연산에 끼어들 수 없다.
- 영속성/지속성(Durability)
- 트랜잭션을 성공적으로 마치면 결과가 항상 저장되어야 한다.
- 트랜잭션이 성공적으로 완료되었으면, 결과는 영구적으로 반영되어야 한다.
트랜잭션의 사용시 발생할 수 있는 문제점
현금 인출기를 작동하는 도중에 기계오류나 정전 등과 같은 예기치 않은 상황이 발생하여 카드가 나오지 않거나 기계 가 멈추는 경우
각 각 다른 지점의 은행에서 동시에 인출할 때, 하나의 지점이 다른지점에서 저장한 잔액을 덮어 쓰는 경우
위와 같은 상황이 발생되지 않도록 방지하기 위해,
즉 트랜잭션의 성질인 ACID 를 제공받기위해 트랜잭션을 사용한다
트랜잭션의 상태
- 활동 (Active)
- 트랜잭션이 실행 중에 있는 상태, 연산들이 정상적으로 실행 중인 상태
- 장애 (Failed)
- 트랜잭션이 실행에 오류가 발생하여 중단된 상태
- 철회 (Aborted)
- 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태
- 부분 완료 (Partially Committed)
- 트랜잭션이 마지막 연산까지 실행했지만, Commit 연산이 실행되기 직전의 상태
- 완료 (Committed)
- 트랜잭션이 성공적으로 종료되어 Commit 연산응 실행한 후의 상태
트랜잭션의 연산
하나의 트랜잭션은 commit 되거나, rollback 된다.
- Commit
- 하나의 트랜잭션이 성공적으로 끝났고,
DB가 일관성있는 상태일 때 이를 알려주기 위해 사용하는 연산 - 트랜잭션 안의 작업 내용 반영 (INSERT, UPDATE, DELETE …)
- 하나의 트랜잭션이 성공적으로 끝났고,
- Rollback
- 하나의 트랜잭션 처리가 비정상적으로 종료되어 트랜잭션 원자성이 깨진 경우
이 트랜잭션의 일부가 정상적으로 처리되었더라도
트랜잭션의 원자성을 구현하기 위해 이 트랜잭션이 행한 모든 연산을 취소(undo)하는 연산 - transaction이 정상적으로 종료되지 않았을 때,
last consistent state(Transaction의 시작 상태 등)로 roll back 할 수 있음. - 트랜잭션 안의 작업 내용 반영안함 (INSERT, UPDATE, DELETE …)
- 하나의 트랜잭션 처리가 비정상적으로 종료되어 트랜잭션 원자성이 깨진 경우
트랜잭션의 전파속성
Propagation(전파속성)
Spring이 제공하는 선언적 트랜잭션(트랜잭션 어노테이션, @Transactional)의 장점 중 하나는 여러 트랜잭션을 묶어서 커다란 하나의 트랜잭션 경계를 만들 수 있다는 점이다. 작업을 하다보면 기존에 트랜잭션이 진행중일 때 추가적인 트랜잭션을 진행해야 하는 경우가 있다.
- 이미 트랜잭션이 진행중일 때 추가 트랜잭션 진행을 어떻게 할지 결정하는 것이 전파 속성(Propagation)이다.
전파 속성에 따라 기존의 트랜잭션에 참여할 수도 있고,
별도의 트랜잭션으로 진행할 수도 있고,
에러를 발생시키는 등 여러 선택을 할 수 있다.
이렇게 하나의 트랜잭션이 다른 트랜잭션을 만나는 상황을 그림으로 나타내면 다음과 같다.
트랜잭션의 격리수준
Isolation(격리수준, 고립레벨)
트랜잭션 격리가 성공하는 정도의 측정값을 말한다.
(SQL 의 Isolation level 과 동일하게 동작)
- [Level 0] Read Uncommitted
- commit 되지 않은 데이터를 읽는다.
- select 수행하는 동안 해당 데이터에 Shared lock이 걸리지 않는다.
- [Level 1] Read Committed
- commit 된 데이터만 읽는다.
- select 수행하는 동안 해당 데이터에 Shared lock이 걸린다.
- [Level 2] Repeatable Read
- 자신의 트랜잭션이 생성되기 이전의 트랜잭션(낮은 번호의 트랜잭션)의 커밋된 데이터만 읽는다.
- 트랜잭션이 완료될 때까지 해당 데이터 수정이 불가능하다.
- [Level 3] Serializable
- LOCK 을 걸고 사용
- 트랜잭션이 완료될 때까지 해당 데이터 수정, 입력이 불가능하다.
- DEFAULT : 사용하는 DB 기본 설정을 따른다. (Oracle 은 READ_COMMITED, Mysql InnoDB 는 REPEATABLE_READ 가 Default)
(참고)
- DB 트랜잭션(Transaction)
- DBMS는 어떻게 트랜잭션을 관리할까?
- 03. 기술 면접 - 데이터베이스 - 트랜잭션
- [Spring] 스프링의 트랜잭션 전파 속성(Transaction propagation) 완벽하게 이해하기
- 트랜잭션 전파 속성 ( propagation ), 롤백 예외
- back/Spring Framework @Transactional Propagation (전파속성), Isolation (격리수준레벨) 그리고 synchronized
- [Spring/DB] @Transactional의 전파 속성과 고립 레벨
- Transaction 전파가 뭡니까?
공부한 내용을 여러글과 책 읽은 내용을 바탕으로 정리하고 있습니다. 참고는 맨 아래 있습니다.
좋은 글로 저의 공부에 도움을 주시는 분들께 감사드립니다.