트랜잭션 (Transaction)
포스트
취소

트랜잭션 (Transaction)

해당 포스트는 SQLD를 학습하며 정리한 내용에 대한 포스트입니다.


이론을 학습한 내용을 정리하고 퀴즈, 기출문제 등을 기록하려고 합니다.


🌈 트랜잭션 (Transaction)과 NULL

💻 트랜잭션 (Transaction)

데이터를 조작하기 위한 하나의 논리적 작업 단위

데이터베이스의 상태를 변화시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위

한꺼번에 모두 수행되어야 할 일련의 연산들을 의미

데이터 모델로 표현 가능

트랜잭션은 하나의 커밋 단위로 묶여야 한다.


영화예매를 하려면 일반적으로 다음 단계를 거친다.

  1. 원하는 영화와 시간대를 선택한다.
  2. 좌석을 선택한다.
  3. 결제를 진행한다.

위 세 단계 모두 완벽하게 수행되어야 영화 예매가 완료된다.

만약 좌석을 선택한 후 결제 과정에서 문제가 발생한다면 어떻게 될까?

예매가 완료되지 않았으므로 선택했던 좌석은 다시 예매 가능 상태로 돌아가야 한다.

그리고 사용자는 처음부터 다시 예매 과정을 진행하게 된다.

이런 것이 바로 트랜잭션이 하는 일이다.

즉, 트랜잭션일련의 작업들이 모두 정상적으로 처리되거나 아니면 전혀 실행되지 않아야 함보장하는 역할을 한다.

데이터베이스에서 트랜잭션이라 함은 한 번에 여러 단계를 거쳐야 하는 작업들의 집합을 말한다.

중간에 어디선가 문제가 생기면, 그 작업들은 모두 원래대로 돌려놓아야 한다(이를 롤백(Rollback)이라고 한다).

모든 작업이 성공적으로 마무리되면 그 변경사항들은 데이터베이스에 반영된다(이를 커밋(Commit)한다고 한다).

BEGIN TRANSACTION(BEGIN TRAN으로도 가능)으로 트랜잭션을 시작

COMMIT TRANSACTION(TRANSACTION 생략 가능) 또는 ROLLBACK TRANSACTION(TRANSACTION 생략 가능)으로 트랜잭션 종료

ROLLBACK구문을 만나면 최초의 BEGIN 시점 또는 SAVEPOINT까지 모두 ROLLBACK이 수행된다.


데이터베이스 트랜잭션ACID라는 특성을 가지고 있다.

트랜잭션 특성설명
원자성
(Atomicity)
- 트랜잭션은 데이터베이스 연산의 전부가 실행되거나
전혀 실행되지 않아야 한다.
- 즉, 트랜잭션의 처리가 완전히 끝나지 않았을 경우는
실행되지 않은 상태와 같아야 한다.
일관성
(Consistency)
- 트랜잭션 실행 결과로 데이터베이스의 상태가 모순되지 않아야 한다.
- 트랜잭션 실행 후에도 일관성이 유지되어야 한다.
고립성/
격리성/
독립성
(Isolation)
- 트랜잭션 실행 중에 생성하는 연산의 중간결과는
다른 트랜잭션이 접근할 수 없다.
- 즉, 부분적인 실행 결과를 다른 트랜잭션이 볼 수 없다.
영속성/
지속성
(Durability)
- 트랜잭션이 그 실행을 성공적으로 완료하면
결과는 영구적 보장이 되어야 한다.


⚡ ACID

ACID데이터베이스 내에서 일어나는 하나의 트랜잭션(transaction)의 안전성을 보장하기 위해 필요한 성질이다.


ACID image

  • Atomicity (원자성)
  • Consistency (일관성)
  • Isolation (고립성, 격리성, 독립성)
  • Durability (영속성,지속성)


🔍 원자성(Atomicity)

트랜잭션이 DB에 모두 반영되던가, 아니면 전혀 반영되지 않아야 함을 의미 즉, 중간 단계까지만 실행되고 실패하는 일이 없어야 한다.

원자성이란 트랜잭션이 안전성 보장을 위해 가져야 할 성질 중의 하나이다.

원자성이란 시스템에서 한 트랜잭션의 연산들이 모두 성공하거나, 반대로 전부 실패되는 성질을 말한다.

원자성은 작업이 모두 반영되거나 모두 반영되지 않음으로서 결과를 예측할 수 있어야 한다.

  • 하나의 단위로 묶여있는 여러 작업이 부분적으로 실행된다면, 업데이트가 일어났지만 누가 업데이트했는지 모르거나, 업데이트 날짜가 누락되는 등 데이터가 오염될 수 있다.

  • 예를 들어 계좌이체를 할 때에는 다음과 같은 두 단계가 있다.

    1. A 계좌에서 출금한다.

    2. B 계좌에 입금한다.


  • 계좌이체를 하려는데 A 계좌에서는 출금이 이뤄지고, B 계좌에 입금되지 않았다고 가정한다.

  • 어디서 문제가 발생했는지 파악할 수 없다면, A 계좌에서 출금된 돈은 세상에서 사라지는 돈이 된다.

  • 만약 은행에서 이런 일이 발생한다면, 은행은 더이상 제 기능을 할 수 없을 것이다다.

  • A 계좌에서 출금하는 일에 성공했지만, B 계좌에 입금하는 작업에 실패한다면 계좌 A에서 출금하는 작업을 포함하여 모든 작업이 실패로 돌아가야 한다는 것이 Atomicity(원자성)이다.

  • 원자성을 지켰다면 1번과 2번, 두 작업이 모두 성공적으로 완료되어야 한다.

  • 그렇지 않으면(둘 중 하나의 작업이라도 실패한다면), 하나의 단위로 묶여있는 모든 작업이 실패하게 만들어 기존 데이터를 보호한다. (롤백 시킨다.)

  • SQL에서도 마찬가지이다.

  • 특정 쿼리를 실행했는데 부분적으로 실패하는 부분이 있다면, 전부 실패하도록 구현되어 있다.

  • 때때로 충돌 요인에 대해서 선택지를 제공한다.


🔍 일관성(Consistency)

트랜잭션이 성공적으로 완료되면, DB가 일관된 상태를 유지해야 한다.

예를 들어, 계좌 이체는 송금자와 수신자 계좌의 총액이 변하지 않는 것처럼.

일관성은 데이터베이스의 상태가 일관되어야 한다는 성질이다.

일관성은 하나의 트랜잭션 이전과 이후, 데이터베이스의 상태는 이전과 같이 유효해야 한다.

다시 말해, 트랜잭션이 일어난 이후의 데이터베이스는 데이터베이스의 제약이나 규칙을 만족해야 한다는 뜻이다.

  • 예를 들어 ‘모든 고객은 반드시 이름을 가지고 있어야 한다’는 데이터베이스의 제약이 있다고 가정한다.

  • 다음과 같은 트랜잭션은 Consistency(일관성)를 위반한다.

    • 이름 없는 새로운 고객을 추가하는 쿼리

    • 기존 고객의 이름을 삭제하는 쿼리


  • 데이터베이스의 유효한 상태는 다를수 있지만, 데이터의 상태에 대한 일관성은 변하지 않아야 한다.

  • 이 예시는 ‘이름이 있어야 한다’ 라는 제약을 위반한다.

  • 따라서 예시 트랜잭션이 일어난 이후의 데이터베이스는 일관되지 않는 상태를 가지게 된다.


🔍 고립성/격리성/독립성(Isolation)

동시에 실행되는 트랜잭션들이 서로 영향을 주지 않아야 한다.

즉, 어떤 트랜잭션도 중간 단계의 결과를 볼 수 없어야 한다.

격리성모든 트랜잭션은 다른 트랜잭션으로 부터 독립되어야 한다는 뜻이다.

실제로 동시에 여러 개의 트랜잭션들이 수행될 때, 각 트랜잭션은 고립(격리)되어 있어 연속으로 실행된 것과 동일한 결과를 나타낸다.

  • 예를 들어 게좌에 만 원이 있다고 가정한다.

  • 이 계좌로부터 계좌 B로 6천 원을, 계좌 C로 6천 원을 동시에 계좌 이체하는 경우, 계좌 B에 먼저 송금한 뒤 계좌 C에 보내는 결과와 동일해야 한다.

  • 동시에 트랜잭션을 실행한다고 해서 계좌 B와 C에 각각 6천 원씩 송금하여 마이너스 통장이 되는 것이 아니다.

  • 각각의 송금 작업을 연속으로 실행하는 것과 동일한 결과가 나타나야 한다.

  • 격리성을 지키는 각 트랜젝션은 철저히 독립적이기 때문에, 다른 트랜젝션의 작업 내용을 알 수 없다.

  • 그리고 트랜잭션이 동시에 실행될 때와 연속으로 실행될 때의 데이터베이스 상태가 동일해야 한다.


격리성이 낮을 경우 발생할 수 있는 문제점

DIRTY READ : 다른 트랜잭션에 의해 수정되었지만 아직 커밋되지 않은 데이터를 읽는 것을 말한다.

NON-REPEATABLE READ : 한 트랜잭션 내에서 같은 쿼리를 두 번 수행했는데, 그 사이에 다른 트랜잭션이 값을 수정 또는 삭제하는 바람에 두 쿼리 결과가 다르게 나타나는 현상

PHANTOM READ : 한 트랜잭션 내에서 같은 쿼리를 두번 수행했는데 첫번째 쿼리에서 없던 유령 레코드가 두번째 쿼리에서 나타나는 현상


🔍 영속성/지속성(Durability)

성공적으로 완료된 트랜잭션의 결과는 영구적으로 반영되어야 한다.

지속성은 하나의 트랜잭션이 성공적으로 수행되었다면, 해당 트랜잭션에 대한 로그가 남아야하는 성징이다.

만약 런타임 오류나 시스템 오류가 발생하더라도, 해당 기록은 영구적이어야 한다는 뜻이다.

  • 예를 들어 은행에서 게좌이체를 성공적으로 실행한 뒤에, 해당 은행 데이터베이스에 오류가 발생해 종료되더라도 계좌이체 내역은 기록으로 남아야 한다.

  • 마찬가지로 계좌이체를 로그로 기록하기 전에 시스템 오류 등에 의해 종료가 된다면, 해당 이체 내역은 실패로 돌아가고 각 계좌들은 계좌이체 이전 상태들로 돌아가게 된다.


🎯 추가 내용


📚 레퍼런스

정미나. (유튜브 선생님에게 배우는) 유선배 SQL개발자(SQLD) 과외노트 / [정미나 저] (2023). Print.

한국데이터산업진흥원. SQL 자격검정 실전문제 : 국가공인 SQL전문가·국가공인 SQL개발자 / 한국데이터산업진흥원 [편] (2020). Print.

SQL 개발자 (SQLD) 자격증 따기 Part.1 / [유용한IT학습]

[데이터베이스] 트랜잭션의 ACID 성질 / [HANAMON]

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.