트랜잭션

2022. 12. 14. 00:41db

트랜잭션이란?

 

- 트랜잭션은 쪼갤 수 없는 업무 처리의 최소단위로 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

'db' 카테고리의 다른 글

데이터 무결성  (0) 2023.01.10
정규화 정리  (0) 2023.01.10
인덱스 정리  (2) 2022.12.21
트랜잭션 REQUIRES_NEW 옵션  (0) 2022.12.18
CQRS  (0) 2022.12.16