ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • #TIL_트랜잭션(Transaction)에 대하여
    TIL (Today I Learned) 2023. 11. 10. 23:31

    # 트랜잭션(Transaction)이란?

    데이터베이스에서 원자성, 일관성, 고립성, 지속성(ACID)등의 속성을 보장하기 위해 수행되는 작업의 논리적 단위를 나타냅니다. 여러 트랜잭션은 동시에 실행될 수 있으며, 데이터베이스 시스템은 이러한 트랜잭션들을 관리하여 안전하고 일관된 데이터 상태를 유지합니다.

     

    **상태를 변화시키는 것은 SQL 질의어를 통해 DB에 접근하는 것입니다.

    - SELECT
    - INSERT
    - DELETE
    - UPDATE

    # 트랜잭션의 특징

    1. 원자성 (Atomicity)

    트랜잭션은 원자적인 단위로 간주되며, 트랜잭션내의 모든 연산은 성공하거나 실패합니다. 만약 어느 한 부분이라도 실패하면 전체 트랜잭션이 실패하고, 모든 변경 사항이 롤백되어 이전 상태로 돌아가게 됩니다. 

     

    2. 일관성(Consistency)

    트랜잭션이 완료된 후에는 데이터베이스가 일관된 상태를 유지해야 합니다. 즉, 트랜잭션이 수행되기 전과 후의 데이터베이스는 일관된 무결성을 유지해야 합니다. 

     

    3. 고립성(Isolation)

    여러 트랜잭션이 동시에 실행될 때, 각각의 트랜잭션은 서로 영향을 미치지 않도록 독립적으로 실행되어야합니다. 

     

    4. 지속성(Durability)

    트랜잭션이 성공적으로 완료되면 그 결과는 영구적으로 저장되어야하며, 시스템 장애시에도 데이터가 손실되지 않아야 합니다. 


    # 트랜잭션의 연산 

    1. 시작(Begin)연산

    트랜잭션의 시작을 나타냅니다. 

     

    2. 종료(Commit)연산

    트랜잭션이 성공적으로 완료되었으며, 결과를 데이터베이스에 반영하는 명령입니다.

     

    3. 롤백(Rollback)연산

    트랜잭션이 성공적으로 완료되면 그 결과는 영구적으로 저장되어야 하며, 시스템 장애 시에도 데이터가 손실되지 않아야 합니다. 


    # 트랜잭션의 상태 

    1. 활동(Active)

    트랜잭션이 실행 중인 상태

     

    2. 실패(Failed)

    트랜잭션이 중단되었고 롤백되거나, 오류 등으로 인해 완료되지 못한 상태

     

    3. 철회(Aborted)

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

     

    4. 부분 완료(Partially Committed)

    트랜잭션이 마지막 연산까지 수행되었지만 아직 커밋되지 않은 상태

     

    5. 완료(Committed)

    트랜잭션이 성공적으로 종료되어 모든 변경 사항이 데이터베이스에 반영된 상태 

     

     


    # ATM(자동 현금 인출기)를 통한 예시 

    ATM 예시를 통해 현금을 인출하는 과정을 트랜잭션으로 살펴보겠습니다. 

    A군과 B군이 있습니다. 둘은 각각의 계좌에서 10,000원씩 있습니다.

    A군이 B군한테 빌렸었던 돈을 갚기 위해 B군에게 2,000원을 보냅습니다. 

     

      A군 B군
    계좌잔고 10,000원 - 2,000원 10,000원

     

     

    그런데 여기서 문제가 발생했습니다. A군은 B군에게 정상적으로 2,000원을 보냈지만, B군이 돈을 받는 과정에서 오류가 발생해 2천원을 받지 못했습니다. 

     

      A군 B군
    계좌잔고 8,000원 10,000원

     

    원래대로면 A군이 B군에게 계좌이체를 성공했을 경우 다음과 같은 작업이 이뤄져야했습니다. 

    1. A군의 잔고에서 2,000원 감소

    2. B군의 잔고에서 2,000원 증가 

     

    하지만 위에 경우에선 1번은 정상적으로 이뤄졌지만, 2번은 오류가 발생해서 A군은 돈을 보냈지만 B군에게 빌렸던 원금을 갚지못하고 비트코인처럼 돈만 사라지는 대참사가 일어났습니다. 

     

    여기서 트랜잭션의 기능이 매우 중요합니다.

     

    DB가 제공하는 트랜잭션 기능을 사용하면 Commit과 Rollback으로 정상적인 작업이 가능하도록 사용할 수 있으며 위의 예시처럼 중간에 문제가 발생한 경우 거래 전의 상태인 롤백(Rollback)으로 되돌아 갈 수 있습니다. 이렇게 되면 눈 뜨고 코베인 A군의 2,000원은 감소하지 않게 됩니다. 그리고 오류가 해결되어 모든 작업이 정상적으로 작동하는 경우 데이터베이스는 커밋(Commit)을 통해 A군의 빚을 탕감하도록 도와줄 것입니다. 

     

     

     


    # 트랜잭션을 사용할 때 주의해야할 점

    1. 트랜잭션 길이 관리

    트랜잭션을 너무 오래 유지하면 다른 트랜잭션들이 대기해야 할 수 있으므로 트랜잭션을 가능한 빠르게 완료하는 것이 중요합니다. 

     

    2. 데드락 관리

    두 개 이상의 트랜잭션이 서로의 작업이 완료될 때까지 기다리는 상태인 데드락을 피하기 위한 전략을 구현해야 합니다. 

     

     

     

     

     

     

Designed by Tistory.