[DB] Transaction?? 그게 뭔데?

chiyongs·2022년 6월 28일
12

DB

목록 보기
1/2
post-thumbnail

Transaction 📎

트랜잭션은 하나의 논리적 작업 단위를 구성하는 일련의 연산들의 집합입니다. DB는 스크립트들을 절차적으로 처리해나갑니다. 따라서, 이 연산들에는 시작과 끝이 항상 존재하겠죠?? 이 시작부터 끝까지를 하나의 단위로 하는 논리 블럭을 트랜잭션이라고 말합니다.

특징 - All or Nothing

트랜잭션은 작업(연산)이 모두 실행되거나(commit),
모두 실행되지 않아야 한다(rollback)는 특징을 가지고 있습니다.

  • 활동(Active) : 트랜잭션이 실행 중인 상태입니다.
  • 실패(Failed) : 트랜잭션 실행에 오류가 발생하여 중단된 상태입니다.
  • 철회(Aborted) : 트랜잭션이 비정상적으로 종료되어 rollback 연산을 수행한 상태입니다.
  • 부분 완료(Partially Committed) : 트랜잭션의 마지막 연산까지 실행했지만, commit 연산이 실행되기 직전의 상태입니다.
  • 완료(Committed) : 트랜잭션이 성공적으로 종료되어 commit 연산을 실행한 후의 상태입니다.
    이미지출처

예시 1

조금 더 풀어서 말씀드리자면, 예시로 처리해야 할 연산이 10개가 있다고 가정하겠습니다.

  • A -> B -> C -> D -> E -> F -> G -> H -> I -> J

절차가 진행되던 중 D 연산에서 문제가 발생한다면, 진행해온 A,B,C 연산들을 모두 처리하지 않은 상태로 복구합니다. 이처럼, 트랜잭션은 모든 연산이 완전히 수행되었을 때만 처리를 진행하고 하나의 연산이라도 실패한다면 모든 연산을 수행하지 않도록 해줍니다.

예시 2

또 다른 예시로 트랜잭션을 이야기할 때 항상 등장하는 돈을 송금하는 상황을 가정해보겠습니다.
철수가 영희에게 10000원을 인터넷 뱅킹을 통해 송금합니다. 이제 인터넷 뱅킹 서비스에서는 철수의 계좌에서 10000원을 출금하고 영희의 계좌에 10000원을 입금하는 절차가 진행됩니다.
만약, 철수의 계좌에서 10000원을 출금하였는데 인터넷 뱅킹 서비스에 오류가 발생하여 영희의 계좌에 10000원이 입금되지 않는다면 어떤 일이 발생할까요??
우리는 인터넷 뱅킹 서비스를 신뢰할 수 없을 뿐더러 철수의 10000원은 세상에서 사라지게 되었습니다. 이런 데이터의 부정합성을 만들지 않기 위해 트랜잭션을 사용합니다.

특성-ACID 🍋

트랜잭션은 4가지 특성을 가지고 있으며 이 4가지 특성이 만족해야 트랜잭션이 안전하게 수행될 수 있습니다. 이 4가지 특성의 앞 글자를 이용해 ACID 특성이라 부릅니다.

원자성 (Atomicity)

트랜잭션은 모든 연산들이 정상적으로 수행 완료되어 데이터베이스에 모두 반영되던지, 아니면 어떠한 연산도 반영하지 않아야 합니다. All or Nothing의 개념으로 작업의 일부만 적용하지 않습니다.

일관성 (Consistency)

일관성은 데이터베이스의 일관성 있는 규칙은 트랜잭션이 완료된 후에도 이 일관성을 유지할 수 있어야 한다는 특성입니다.
일관성을 깨진 데이터는 트랜잭션이 성공적으로 실행되지 않아야 합니다.
따라서, 트랜잭션의 수행 전후 DB 상태는 각각 일관성이 보장되는 서로 다른 상태입니다.

독립성 (Isolation)

여러 트랜잭션이 동시에 실행되는 경우 각각의 트랜잭션은 독립적으로 수행되며, 서로의 영향을 받지 않고, 서로의 연산에 끼어들 수 없습니다. 트랜잭션이 실행하는 도중에 변경한 데이터는 이 트랜잭션이 완료될 때까지 다른 트랜잭션이 참조하지 못하게 하는 특성입니다.

지속성 (Durability)

성공적으로 완료된 트랜잭션의 결과는 DB에 영구적으로 반영되어야 합니다. 완료된 트랜잭션의 결과는 어떠한 일이 있어도 변경 사항이 무조건 반영되어야 한다는 것입니다.

그렇다면 commit과 rollback은 어떻게 실행될까요??

DBMS는 보통 Solid State Disk나 Hard Disk같은 디스크에 데이터를 저장합니다.
그렇다면 트랜잭션에 의해 데이터가 변경된다면 어떻게 작업이 진행될까요?
DBMS는 데이터의 변경이 일어난다면 원본 데이터의 복사본을 메모리에 올리고 복사본 데이터에 변경을 반영합니다.
만약 트랜잭션이 정상적으로 완료가 된다면, 이제 변경된 데이터들을 실제로 디스크에 적용해야 합니다. 이 때 메모리에서 관리되던 데이터의 변경이 실제 파일에 적용이 되는 것, 즉 write가 발생하는데 이것을 commit이라고 합니다.
만약 트랜잭션 처리 도중 오류가 발생한다면, rollback이 실행되야 합니다. rollback이 실행된다면, DBMS는 메모리에서 변경이 일어난 부분을 삭제합니다. 이런 방식으로 rollback 명령이 반영됩니다.


마무리

실제 서비스에서는 여러 트랜잭션이 수행되고 rollback과 commit이 계속해서 발생하는데 DBMS는 트랜잭션의 ACID 특성을 보장하면서 데이터의 정합성을 어떻게 유지할 수 있을까요?
이 궁금증을 해결하기 위해서 다음 글에서 트랜잭션 격리수준(Transaction Isolation Level)에 대해 알아보도록 하겠습니다. 긴 글 읽어주셔서 감사합니다.😊


Ref

0개의 댓글