트랜잭션

2021-01-13
  • Java
  • JPA

Transaction

트랜잭션이란?

트랜잭션이란, 데이터베이스의 상태를 바꾸는 기능을 수행하기 위한 작업의 단위 이다. 모든 명령어의 성공 또는 실패를 한 번에 처리하는데, 이 기능이 정상적으로 동작하려면 성공 또는 실패가 한 번에 일어나야한다.

트랜잭션 처리가 필요한 이유

철수가 영희에게 1000원을 송금하는 상황은 아래와 같이 요약할 수 있다.

  • 철수의 계좌에서 1000원 출금
  • 영희의 계좌에 1000원 입금

그런데 만약 철수의 계좌에서 출금이 성공했지만 영희의 계좌에 입금하는 도중 오류가 발생하면, 철수의 계좌에서는 이미 천원이 줄었으나 영희는 받은 돈이 없는 상황이 된다.

이러한 상황이 발생하면 안되므로, 두 가지 기능은 하나의 트랜잭션으로 관리해야 한다. 하나의 트랜잭션으로 관리하면 영희의 계좌에 입금하는 기능이 실패했을 경우, 철수의 계좌에 돈이 다시 입금해야 한다. 이러한 기능이 RollBack이다.

트랜잭션 성질

  • 원자성(Atomicity) : 한 트랜잭션 내에서 실행한 작업들은 하나로 간주함. 즉, 모두 성공 혹은 실패
  • 일관성(Consistency) : 트랜잭션은 일관성 있는 데이터베이스 상태를 유지한다.
  • 격리성(Isolation) : 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 격리해야한다.
  • 지속성(Durability) : 트랜잭션을 성공적으로 마치면 결과가 항상 저장되어야한다.

여러개의 트랜잭션이 경쟁한다면?

특정 트랜잭션이 수정 후 아직 커밋하지 않았는데 다른 트랜잭션이 그 레코드에 접근할 수 있다.

이러한 경쟁 상황에서 발생할 수 있는 문제는 크게 세 가지이고, 이를 해결하기 위한 트랜잭션 격리 수준(Transaction Isolation Level)이 정의되어있다.

1. Dirty Read

수정중인 데이터에 접근을 허용할 경우 발생하는 데이터 불일치이다.

2. Non-Repeatable Read

한 트랜잭션에서 같은 쿼리를 두 번 실행했을 때 발생하는 데이터 불일치이다.

3. Phantom Read

한 트랜잭션에서 일정 범위의 레코드를 두 번 이상 읽을 때 발생하는 데이터 불일치이다.

트랜잭션 격리수준

읽어보기..

출처

https://preamtree.tistory.com/154

Profile picture

2yeseul

트리플에서 백엔드 개발을 맡고 있습니다. 무한 삽질을 기록합니다. ⚒️