2022. 12. 14. 00:41ㆍdb
트랜잭션이란?
- 트랜잭션은 쪼갤 수 없는 업무 처리의 최소단위로 db의 상태를 변환시킬 때 하나의 논리적 기능을 수행하기 위한 작업의 단위이다.

트랜잭션에 대해 예시로 이해를 해보자
예를 들어 A라는 사람의 통장에 2만원이 있을고 B의 통장에 5만원이 있을 때 A가 B에게 1만원을 송금을 하는 상황이 있다고 하자.
그러면 정상적으로 거래가 완료되려면 A의 통장의 잔액은 1만원이 되는 동시에 B의 통장의 잔액은 6만원이 되야한다. 이처럼 쪼갤 수 없는 업무 처리를 할 때 트랜잭션을 활용한다.
트랜잭션의 4가지 특징(ACID)
원자성(Atomicity)
- 트랜잭션이 db에 모두 반영되거나, 혹은 전혀 반영되지 않아야 된다.
일관성(Consistency)
- 트랜잭션이 완료된 결과값이 일관적인 상태를 유지해야 한다.
ex) 기본키, 외래키 같은 명시적인 무결성 제약 조건 + 비명시적인 일관성 조건
고립성
- 하나의 트랜잭션 수행시 다른 트랜잭션의 작업이 끼어들지 못하도록 보장해야 한다.
지속성
- 트랜잭션이 정상적으로 종료된 후에는 영구적으로 db에 작업의 결과가 저장되어야 한다.
trasaction propagation
- 트랜잭션의 경계에서 이미 진행 중인 트랙잭션이 있을 때 어떻게 동작할지 결정하는 것을 말한다.
옵션
1.REQUIRED
- 부모 트랜잭션이 존재한다면 부모 트랜잭션에 합류, 그렇지 않다면 새로운 트랜잭션을 만든다.
- 중간에 자식/ 부모에서 롤백이 발생된다면 자식과 부모 모두 롤백한다.

2. Requires_new
- 무조건 새로운 트랜잭션을 만든다.
- 롤백은 각각 이루어진다.

3. mandatory
- 무조건 부모 트랜잭션에 합류시킨다.
- 부모 트랜잭션이 존재하지 않는다면 예외를 발생시킨다.

4. supports
- 메소드가 트랜잭션을 필요로 하지는 않지만, 진행중인 트랜잭션이 존재하면 트랜잭션을 사용한다는 것을 의미한다. 진행 중인 트랜잭션 존재하지 않더라도 메소드는 정상적으로 동작한다.
5. nested
- 부모 트랜잭션이 존재하면 부모 트랜잭션에 중첩시키고, 부모 트랜잭션이 존재하지 않는다면 새로운 트랜잭션을 생성한다.

6. never
- 메소드가 트랜잭션을 필요로 하지 않는다. 트랜잭션이 존재하면 익셉션이 발생한다.

transaction isolation
1. read uncommitted
- 커밋 전의 내용을 다른 트랜잭션에서 읽는 것을 허용
문제점 : 트랜잭션 작업이 완료되지 않은 정보를 다른 트랜잭션에서 읽을 수 있다.

2. read committed
- 커밋이 완료된 트랜잭션의 변경사항만 다른 트랜잭션에서 읽는 것을 허용

문제점 : 트랜잭션 커밋 전과 커밋 후의 조회했을 때의 결과가 다를 수 있다.

3. repeatable read
- 트랜잭션 id보다 작은 트랜잭션 번호에서 변경한 것만 읽는 것을 허용

문제점 : 다른 트랜잭션에서 수행한 변경 작업에 의해 레코드가 보였다가 안 보였다가 하는 현상이 발생할 수 있다.

4. serializable
- 가장 엄격한 격리 수준
- 문제점 : 위에서 발생한 문제는 없지만 속도가 느리다.
reference
https://nesoy.github.io/articles/2019-05/Database-Transaction-isolation
https://devlog-wjdrbs96.tistory.com/424
https://deveric.tistory.com/86