ACID 트랜잭션

eunsiver·2023년 4월 29일
0

데이터베이스

목록 보기
5/9

🌐트랜잭션🌐

  • 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위, 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미

  • 트랜잭션에는 여러 개의 연산이 수행될 수 있고, 수행 중에 한 작업이라도 실패하면 전부를 rollback하고 모두 성공해야 commit한다.

  • Commit 연산 : 한개의 논리적 단위(트랜잭션)에 대한 작업이 성공적으로 끝났고 데이터베이스가 다시 일관된 상태에 있을 때, 이 트랜잭션이 행한 갱신 연산이 완료된 것을 트랜잭션 관리자에게 알려주는 연산
  • Rollback 연산 : Rollback 연산은 하나의 트랜잭션 처리가 비정상적으로 종료되어 데이터베이스의 일관성을 깨뜨렸을 때, 이 트랜잭션의 일부가 정상적으로 처리되었더라도 트랜잭션의 원자성을 구현하기 위해 이 트랜잭션이 행한 모든 연산을 취소(Undo)하는 연산

아래 사진은 하나의 트랜잭션을 나타낸다.

❓ 트랜잭션의 목적

  • 사용자가 데이터베이스의 완전성 (Integrity)를 유지하기 위해(데이터 부정합을 방지하기 위해)
  • 데이터 부정합의 예시
    DB 서버에 여러 개의 클라이언트가 동시에 접근하거나 응용프로그램이 갱신을 처리하는 과정에서 중단되는 경우
  • 데이터 부정합을 막기 위해서 프로세스를 병렬로 처리하지 않도록 해야하지만 이는 효율이 매우 떨어진다
    👉 프로세스를 병렬로 처리할 수 밖에 없는 현실적 상황에서 데이터 부정합을 방지하기 위해 트랜잭션을 사용하는 것이다.


🌈 ACID

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

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

  • ACID는 주식거래, 금융업에서 중점적으로 사용된다.
    => 주식거래, 금융업에서는 관계형 데이터베이스를 이용한다.
    관계형 데이터베이스를 사용하면 데이터베이스와 상호 작용하는 방식을 정확하게 규정할 수 있기 때문에,
    데이터베이스에서 데이터를 처리할 때 발생할 수 있는 예외적인 상황을 줄이고, 데이터베이스의 무결성을 보호할 수 있다.


🟣 원자성(Atomicity)

  • all or nothing
  • 원자성이란 시스템에서 한 트랜잭션의 연산들이 모두 성공하거나, 반대로 전부 실패되는 성질
  • 트랜잭션의 모든 연산들이 정상적으로 수행 완료되거나 아니면 전혀 어떠한 연산도 수행되지 않은 상태를 보장해야 한다.
  • 수행하고 있는 트랜잭션에 의해 변경된 내역을 유지하면서 이전에 commit된 상태를 임시 영역에 따로 저장함으로써 보장한다. 다시말해, 현재 수행하고 있는 트랜잭션에서 오류가 발생하면 현재 내역을 날리고 임시 영역에 저장했던 상태로 rollback 한다.

🌌 Rollback Segment

이전 데이터들이 임시로 저장된 영역을 Rollback Segment 라고 한다.
👉 트랜잭션의 원자성은 Rollback Segment에 의해 보장된다.
현재 수행하고 있는 트랜잭션에 의해 새롭게 변경되는 내역을 Database Table이라고 한다.

🌌 Save Point

질의 수행
savepoint A
질의 수행
rollback to A

트랜잭션의 길이가 길어지면 확실하게 오류가 발생하지 않은 부분도 처음부터 다시 작업을 수행해햐되는 비효율성 문제가 생긴다. 따라서 확실한 부분에 대해서는 rollback이 되지 않도록 Save Point (중간 저장 지점)을 지정한다.

Save Point를 지정하면 rollback할 때 지정된 save point 이후부터 진행하게 된다.

🌌 원자성의 예)

계좌이체를 할 때에는 다음과 같은 두 단계가 있다.
1. A 계좌에서 출금한다.
2. B 계좌에 입금한다.

계좌이체를 하려는데 A 계좌에서는 출금이 이뤄지고, B 계좌에 입금되지 않았다고 가정한다.
어디서 문제가 발생했는지 파악할 수 없다면, A 계좌에서 출금된 돈은 세상에서 사라지는 돈이 된다.
만약 은행에서 이런 일이 발생한다면, 은행은 더이상 제 기능을 할 수 없을 것이다다.

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

원자성을 지켰다면 1번과 2번, 두 작업이 모두 성공적으로 완료되어야 한다.
그렇지 않으면(둘 중 하나의 작업이라도 실패한다면), 하나의 단위로 묶여있는 모든 작업이 실패하게 만들어 기존 데이터를 보호한다. (롤백 시킨다.)


🟣 일관성(Consistency)

  • 고립된 트랜잭션의 수행이 데이터베이스의 일관성을 보존해야 한다.
  • 성공적으로 수행된 트랜잭션은 정당한 데이터들만을 데이터베이스에 반영해야 한다.
  • 트랜잭션에서 일관성은 트랜잭션 수행 전, 후에 데이터 모델의 모든 제약 조건(기본키, 외래키, 도메인, 도메인 제약조건 등)을 만족하는 것을 통해 보장.
  • 트랜잭션의 수행을 데이터베이스 상태 간의 전이(transition)로 봤을 때, 트랜잭션 수행 전후의 데이터베이스 상태는 각각 일관성이 보장되는 서로 다른 상태가 된다.
  • 트랜잭션 수행이 보존해야 할 일관성은 기본 키, 외래 키 제약과 같은 명시적인 무결성 제약 조건들뿐만 아니라, 자금 이체 예에서 두 계좌 잔고의 합은 이체 전후가 같아야 한다는 사항과 같은 비명시적인 일관성 조건들도 있다.
  • 테이블B의 기본키 (b_id) 가 테이블A의 외래키 (b_id) 로 존재할 경우, b_id에 대한 제약조건이 테이블B에서 변경되면 b_id를 외래키로 가지는 테이블A에서도 변경되어야 한다.
  • 이벤트와 조건이 발생할 떄 트리거 (Trigger)를 통해 트랜잭션 일관성을 보장한다.

🟣 고립성/독립성(Isolation)

  • 여러 트랜잭션이 동시에 수행되더라도 각각의 트랜잭션은 다른 트랜잭션의 수행에 영향을 받지 않고 독립적으로 수행되어야 한다.
  • 둘 이상의 트랜잭션 수행시 다른 트랜잭션의 연산 작업이 끼어들 수 없다. (수행중인 트랜잭션이 완전히 완료될 때까지 다른 트랜잭션에서 수행 결과를 참조할 수 없다.)

🟣 지속성(Durability)

  • 트랜잭션이 커밋된 이후에는 런타임 오류나 시스템 오류가 발생하더라도, 커밋된 상태를 유지하는 것을 보장하며 해당 기록은 영구적이어야 한다는 뜻이다.
  • 성공적으로 commit 된 데이터는 H/W 결함이 발생하거나, DB가 죽더라도 보존되어야 하며 SSD와 같은 비휘발성 저장소에 기록됐다는 뜻이다.
  • 또한 복제 기능이 있는 DB 에서 지속성은 다른 node 몇 개에 성공적으로 복사가 되었음을 의미하기도 한다.

즉, 정상적으로 완료 혹은 부분완료된 데이터는 DBMS가 책임지고 데이터베이스에 기록하는 성질을 트랜잭션의 Durability(영속성)이라고 함.


트랜잭션은 아래 세 가지 중 하나의 형태로 종료된다.

  1. 문제 없이 정상적으로 수행된 경우에는 커밋을 통해 종료

  2. 잘못된 입력이 주어졌거나 일관성 제약 조건을 위배한다거나 하는 상황이 발생되거나 사용자의 요청에 의해 철회 되는 경우

  3. 타임 아웃이나 교착상태 등과 같이 시스템이 감지하는 문제로 인하여 DBMS가 철회하는 경우

이 외에도 트랜잭션은 각종 시스템 고장으로 인해 영향을 받을 수 있으며, DBMS는 이와 같은 상황에서 트랜잭션을 관리해야한다.


참고

profile
Let's study!

0개의 댓글