[CS] - 트랜잭션

buckshot·2024년 5월 28일

cs

목록 보기
8/15
post-thumbnail

트랜잭션 - Transaction

트랜잭션이란 여러 개의 작업을 하나로 실행하는 유닛, 데이터 베이스의 상태를 변환 시키는 기능을 수행하기 위한 하나 이상의 쿼리들을 모와둔 하나의 작업 단위를 말한다.

간단하게 비유를 하면, 온라인 쇼핑을 할 때 여러 상품을 장바구니에 담고 결제하는 과정이라고 생각하면 된다.

ACID

그럼 왜?🙄 트랜잭션을 장바구니로 비유가 가능할까?? 라는 생각을 할 수 있다.

여기서 중요한 부분은 트랜잭션의 핵심 개념인 ACID 속성이 있다.

  • Atomicity (원자성)

    원자성은 트랜잭션의 모든 연산이 전부 수행이 되거나 전혀 수행되지 않아야 함을 의미한다.
    이는 트랜잭션이 모든 연산이 성공적으로 완료되지 않으면, 데이터 베이스는 트랜잭션이 시작되기 전의 상태로 복원이 되어야 한다.

    일상에서 계좌 간의 송금 작업에서 돈이 출금된 후 입금이 실패를 하면 해당 금액이 출금 취소되어야 하는 것과 비슷하다.

  • Consistency (일관성)

    일관성은 트랜잭션이 완료된 후 데이터 베이스가 일관성 있는 상태를 유지해야 함을 의미한다.
    트랜잭션 전후의 데이터 베이스 상태가 일관된 규칙과 제약 조건을 충족을 해야 한다.

    데이터 베이스에서 참조 무결성 제약 조건이 있으면, 트랜잭션 후에도 이 조건이 유지가 되어야 한다.

  • Isolation (격리성)

    격리성은 동시에 실행되는 트랜잭션등리 서로의 실행 결과에 영향을 미치지 않도록 하는 것을 의미한다. 격리 수준에 따라 트랜잭션 간의 상호작용을 제어할 수 있다.

    두 트랜잭션이 동시에 같은 데이터를 읽고 수정을 하려고 할 때, 하나의 트랜잭션이 완료되기 전까지는 다른 트랜잭션이 해당 데이터를 수정하지 못하게 한다.

  • Durability (지속성)

    지속성은 트랜잭션이 완료된 후 그 결과가 영구적으로 데이터 베이스에 저장되어 시스템에 장애가 발생하더라도 손실되지 않아야 함을 의미한다.

    트랜잭션이 완료된 후 데이터 베이스 서버가 갑자기 다운되더라도 트랜잭션의 결과는 데이터 베이스에 적용이 되어야 한다.

ACID원칙 꼭 지켜야 해??

해당 원칙을 지켜야 하는 이유는 데이터베이스의 무결성과 일관성을 유지하고, 시스템의 신뢰성을 보장하기 위함이다. 그렇기 때문에 원칙을 위반하게 된다면 각기 다양한 문제점과 오류를 야기한다.

각 원칙을 위반했을 시 발생하는 문제점을 보겠다.

  • Atomicity (원자성)

    트랜잭션의 일부 작업만 수행되고 나머지 작업을 실패할 수 있다.
    송금하는 상황을 생각하면 계좌에서 출금은 되었지만 상대방에게 입금되지 않는다면 자금 손실이 발생할 수 있다.

    시스템이 부분적으로 업데이트 되어 데이터의 일관성이 무너질 수 있다.

  • Consistency (일관성)

    데이터베이스의 규틱과 제약 조건에 위반되어 데이터 무결성이 손상될 수 있다.
    데이터베이스의 일관성이 무너지게 된다면, 비지니스 로직이 예상대로 작동하지 않을 수 있다.

  • Isolation (격리성)

    한 트랜잭션이 아직 커밋이 되지 않은 다른 트랜잭션의 데이터를 읽을 수 있는 Dirty Read가 발생한다.

    동일한 트랜잭션 내에서 같은 데이터를 여러 번 읽을 때, 읽을 때마다 다른 결과가 나타날 수 있는 Non-Repeatable Read가 발생된다.

    한 트랜잭션이 범위 쿼리를 수행할 때, 다른 트랜잭션이 해당 범위 내에 데이터를 CRUD동작을 하여 첫 번째 트랜잭션이 같은 쿼리를 다시 수행할 때 다른결과가 나타날 수 있는 Phantom Read가 발생한다.

  • Durability (지속성)

    트랜잭션이 완료된 후 결과가 반영되지 않으면, 데이터베이스는 일관성을 잃은 상태인 비일관성 상태가 된다.

결론적으로 ACID원칙을 준수하지 않으면 데이터베이스의 신뢰성, 일관성, 무결성이 손상이 되며, 이는 데이터베이스를 사용하는 애플리케이션의 전반적인 기능에 영향을 미칠 수 있다. 결과적으로 비지니스 로직의 오류, 데이터 손실, 비일관성 등의 심각한 문제를 초래할 수 있으므로 해당 원칙을 준수하는 것이 상당히 중요한 부분이 될 것이다.

트랜잭션의 상태


트랜잭션은 실행 중에 여러 상태를 가질 수 있다.

  • Active (활성)

    트랜잭션이 시작되어 연산이 진행 중인 상태이다.

    트랜잭션은 데이터를 읽고 쓰는 작업을 수행하며, 해당 단계에서는 트랜잭션이 아직 완료되지 않았다.

  • Partially Committed (부분 완료 상태)

    트랜잭션의 마지막 연산이 실행된 후, 커밋이 되기 직전의 상태이다.
    모든 연산이 성공적으로 되었지만, 아직 데이터 베이스에 영구적인 저장이 되기 전의 상태

  • Committed (완료 상태)

    트랜잭션이 성공적으로 완료되어 데이터 베이스에 모든 변경 사항이 영구적으로 저장된 상태이다.
    해당 상태에서 트랜잭션의 결과가 데이터 베이스에 반영이 되며, 시스템 장애가 발생해도 그 결과는 손실되지 않는다.

  • Failed (실패 상태)

    트랜잭션이 실행 중 오류가 발생하여 중단된 상태이다.
    트랜잭션의 일부 연산이 실패하여 모든 변경 사항이 취소되어야 한다.

  • Aborted (중단 상태)

    트랜잭션이 실패하여 롤백된 상태이다.
    트랜잭션이 수행한 모든 변경 사항이 취소되고, 데이터 베이스는 트랜잭션 이전의 상태로 돌아간다.
    트랜잭션은 어떻게든 ALL-Or-Nothing 방식으로 DML 명령어들을 처리한다.

트랜잭션의 격리 수준 Isolation Levels

트랜잭션의 격리 수준은 동시에 실행되는 트랜잭션들이 서로 실행 결과에 미치는 영향울 제어하는 방법을 정의한다.
데이터베이스에서 트랜잭션의 격리 수준을 적절히 설정함으로 데이터 무결성과 일관성을 유지하면서도 성능을 최적화할 수 있다.
ANSI/ISO SQL 표준에서는 4가지의 주된 격리 수준을 정의하고 있다.

  • Read Uncommitted (커밋되지 않은 읽기)
    • 가장 낮은 수준의 격리 등급이다. 한 트랜잭션이 다른 트랜잭션이 커밋하지 않은 데이터를 읽을 수 있다.
    • Dirty Read문제가 발생할 수 있다.
  • Read Committed (커밋된 읽기)

    • 트랜잭션이 커밋된 데이터만 읽을 수 있다.
    • Dirty Read는 발생하지 않지만, Non-repeatable ReadPhantom Read는 발생할 수 있습니다.
  • Repeatable Read (반복 가능한 읽기)

    • 동일한 트랜잭션 내에서 같은 데이터를 여러번 읽어도 항상 같은 결과를 보장한다.
    • Dirty ReadNon-repeatable Read는 발생하지 않지만, Phantom Read는 발생할 수 있습니다.
  • Serializable (직렬화 가능)

    • 가장 높은 수준의 격리 등급으로, 트랜잭션들이 직렬적으로 실행되는 것처럼 동작을 한다.
    • Dirty Read, Non-repeatable Read, Phantom Read가 모두 발생하지 않습니다.

격리 수준의 요약

Read Uncommitted은 가장 낮은 격리 수준으로 성능은 좋지만, 데이터 무셜성을 보장하지 않는다.

Read Committed 중간 정도 수준의 격리로 커밋되지 않은 데이터를 읽지 않음으로써 일부 일관성 문제를 해결하지만, 반복 가능한 읽기를 보장하지 않는다.

Repeatable Read 높은 수준의 격리로 반복 가능한 읽기를 보장하지만, 팬텀 읽기는 발생할 수 있다.

Serializable 가장 높은 수준의 격리다. 모든 일관성 문제를 방지를 하지만 성능 저하를 초래할 수 있다.

각각의 격리 수준은 데이터 무결성과 시스템 성능 간의 트레이드오프를 반영한다. 따라서 데이터베이스 시스템에서는 사용자는 요구사항과 시스템의 성능을 고려하여 적절한 격리 수준을 선택하는 것이 중요하다.

profile
let's go insane

0개의 댓글