Transaction이란?

바다·2024년 7월 4일
0

DataBase

목록 보기
5/6
post-thumbnail

Transaction

  • 데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위
  • 하나의 작업을 위해 더이상 분할될 수 없는 명령들의 모음!
  • 즉, 한꺼번에 수행되어야 할 일련의 연산 모음을 의미

데이터베이스와 어플리케이션의 데이터 거래에 있어서 안정성을 확복하기 위한 방법이 트랜잭션


1. 트랜잭션의 특징 ACID

1) 원자성 (Atomicity)

"트랜잭션 내의 작업이 데이터베이스에 모두 반영되거나, 모두 반영되지 않아야 한다"

  • 트랜잭션은 사람이 설계한 논리적인 작업 단위로서, 일처리는 작업 단위 별로 이루어져야 사람이 다루는 데 무리가 없다
  • 만약 트랜잭션 단위로 데이터가 처리되지 않는다면, 설계한 사람은 데이터 처리 시스템을 이해하기 힘들 뿐만 아니라, 오작동 했을 시 원인을 찾기가 매우 힘들어진다

2) 일관성 (Cnistency)

"트랜잭션의 작업 처리 결과는 항상 일관적이어야 한다"

  • 트랜잭션이 진행되는 동안에 데이터베이스가 변경되더도, 업데이트된 데이터베이스로 트랜잭션이 진행되는 것이 아니라, 처음에 트랜잭션을 진행하기 위해 참조한 데이터베이스의 데이터들로 진행된다
  • 이를 통해, 사용자는 일관성 있는 데이터를 볼 수 있다

3) 독립성 (Isolation)

"서로 다른 트랜잭션이, 서로의 연산에 끼어들 수 없다"

  • 하나의 트랜잭션이 완료될 때까지, 다른 트랜잭션이 특정 트랜잭션의 결과를 참조할 수 없다

4) 영구성 (Durability)

"트랜잭션의 결과는 영구적으로 반영되어야 한다"

  • 트랜잭션이 성공적으로 완료되었을 경우, 결과는 데이터베이스에 영구적으로 반영되어야 한다

2. 트랜잭션 상태

1) 활성 (Active)

  • 트랜잭션이 정상적으로 실행 중인 상태
  • 트랜잭션이 시작되면, 해당 트랜잭션의 상태는 활동 상태 가 된다
  • 설계자가 설계한 대로 연산이 정상적으로 실행 중인 상태

2) 부분 완료 (Partially Committed)

  • 트랜잭션이 마지막까지 실행되었지만, Commit 연산이 실행되기 이전의 상태
  • 설계된 트랜잭션대로 명령을 성공적으로 수행하면, 부분 완료 상태가 된다
  • 설계된 작업대로 작업이 성공하였다고 해서 무조건 반영하는 것이 아니라, 설계자의 최종 승인이 있을 때까지 실제 데이터베이스에 작업 내용을 반영하지 않고 기다리고 있는 상태

3) 완료 (Committed)

  • 트랜잭션이 성공적으로 종료되어 Commit 연산 을 실행한 후의 상태
  • 설계자가 작업 결과에 대하여 반영을 승인한다면 트랜잭션이 성공적으로 종료된다

4) 실패 (Failed)

  • 트랜잭션 실행에 오류가 발생하여 중단된 상태

5) 철회 (Aborted)

  • 트랜잭션이 비정상적으로 종료되어 Rollback 연산 을 수행한 상태

3. 트랜잭션의 격리 수준

트랜잭션의 격리 수준(Isolation Level)이란?
여러 트랜잭션이 동시에 처리될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경되고 있거나 조회되고 있는 데이터를 어느 수준까지 허용할 것인지에 대한 수준이다

1) Serializable

  • 가장 엄격한 격리 수준
  • 여러 트랜잭션이 동일한 데이터에 동시 접근할 수 없으므로, 어떠한 데이터 부정한 문제도 발생하지 않는다
  • 하지만, 트랜잭션이 순차적으로 처리되어야 하므로 동시 처리 성능이 매우 떨어진다
  • Serializable은 가장 안전하지만 가장 성능이 떨어지기 때문에, 극단적으로 안전한 작업이 필요한 경우가 아니라면 사용해서는 안 된다

2) Repeatable Read

  • 각 트랜잭션에 번호를 부여하여, 자신의 트랜잭션 번호보다 먼저 실행된 트랜잭션의 데이터만을 조회할 수 있도록 한다
  • 만약, 테이블에 자신보다 이후에 실행된 트랜잭션의 데이터가 존재한다면 언두 로그를 참고해서 데이터를 조회한다
  • Repeatable Read는 새로운 레코드의 추가까지는 막지 않기 때문에, SELECT로 조회를 할 경우 트랜잭션이 끝나기 전에 다른 트랜잭션에 의해 추가된 데이터가 발견될 수 있다! 이를 유령 읽기(Phantom read)라고 한다

3) Read Committed

  • 트랜잭션 순서에 관계 없이 커밋된 데이터는 모두 조회할 수 있다
  • Read Committed는 Phantom Read 문제에 더해, Non-Repeatable Read (반복 읽기 불가능) 문제가 발생한다
  • 예를 들어, 사용자A가 트랜잭션을 시작해서 어떤 데이터를 변경하였고, 아직 커밋은 하지 않은 상태라고 할 때 다른 사용자는 사용자A가 커밋하기 이전의 데이터를 읽을 수 있다. 하지만, 사용자A가 작업을 마치고 커밋을 하는 순간 다른 트랜잭션에서도 새롭게 변경된 값을 참조할 수 있다.
  • 반복 읽기를 수행할 경우, 커밋의 여부에 따라 조회 결과가 달라지는 부정합 문제를 겪는 것이 일반적인 경우에는 크게 문제가 되지 않지만, 금전적인 작업과 연결되어 있는 경우에는 문제가 생길 수 있다

4) Read Uncommitted

  • 트랜잭션에 관계 없이 커밋하지 않은 데이터도 조회할 수 있다
  • Read Uncommitted에서는 다른 트랜잭션의 작업이 커밋 또는 롤백 되지 않아도 즉시 보이게 된다
  • 어떤 트랜잭션의 작업이 완료되지 않았는데도, 다른 트랜잭션에서 볼 수 있는 부정합 문제를 Dirty Read(오손 문제)라고 한다
  • Dirty Read는 데이터가 조회되었다가 사라지는 현상을 초래하기 때문에 시스템에 상당한 혼란을 주게 된다
profile
ᴘʜɪʟɪᴘᴘɪᴀɴs 3:14

0개의 댓글