본문 바로가기

CS/Computer Science

01/12 트랜잭션의 ACID 성질

트랜잭션(Transaction)

트랜잭션이란 질의(query)를 하나의 묶음 처리해서 만약 중간에 실행이 중단됐을 경우, 처음부터 다시 실행하는 Rollback을 수행하고, 오류없이 실행을 마치면 commit을 하는 하나의 작업 단위를 의미합니다.

 

  • 각 트랜잭션은 하나의 특정 작업으로 시작을 해서 묶여 있는 모든 작업들은 다 완료해야 정상적으로 종료한다.
  • 만약 하나의 트랜잭션에 속해 있는 여러 작업 중에서 단 하나의 작업이라도 실패하면, 이 트랜잭션에 속한 모든 작업을 실패한 것으로 판단한다.
  • 작업이 하나라도 실패를 하게 되면 트랜잭션도 실패이고, 모든 작업이 성공적이면 트랜잭션 또한 성공이다.
  • 성공 또는 실패라는 두 개의 결과만 존재하는 트랜잭션은, 미완료된 작업없이 모든 작업을 성공해야 한다.
  • 데이터베이스 트랜잭션은 ACID라는 특성을 가지고 있다.

ACID

ACID는 데이터베이스 내에서 일어나는 하나의 트랜잭션(Transaction)의 안전성을 보장하기 위해 필요한 성질이다.ACID는 주식거래, 금융업에서 중점적으로 사용된다. => 주식거래, 금융업에서는 관계형 데이터베이스를 이용한다. 관계형 데이터베이스를 사용하면 데이터베이스와 상호 작용하는 방식을 정확하게 규정 할 수 있기 때문에, 데이터베이스에서 데이터를 처리할 때 발생할 수 있는 예외적인 상황을 줄이고, 데이터베이스의 무결성을 보호할 수 있다.

❗ Atomicity(원자성)

원자성이란 트랜잭션이 안정성 보장을 위해 가져야 할 성질 중의 하나이다.원자성이란 시스템에서 한 트랜잭션의 연산들이 모두 성공하거나, 반대로 전부 실패되는 성질을 말한다.원자성은 작업이 모두 반영되거나 모두 반영되지 않음으로서 결과를 예측할 수 있어야 한다.

 

  • 하나의 단위로 묶여있는 여러 작업이 부분적으로 실행된다면, 업데이트가 일어났지만 누가 업데이트했는지 모르거나, 업데이트 날짜가 누락되는 등 데이터가 오염될 수 있다.
  • 예를 들어 계좌이체를 할 때에는 다음과 같은 두 단계가 있다.
    • A계좌에서 출금한다.
    • B계좌로 입금한다.
  • 계좌이체를 하려는데 A 계좌에서는 출금이 이뤄지고, B 계좌에 입금되지 않았다고 가정한다.
  • A 계좌에서 출금하는 일에 성공했지만, B 계좌에 입금하는 작업에 실패한다면 계좌 A에서 출금하는 작업을 포함하여 모든 작업이 실패로 돌아가야 한다는 것이 Atomicity(원자성)이다.
  • 원자성을 지켰다면 1번과 2번, 두 작업이 모두 성공적으로 완료되어야 한다.
  • 그렇지 않으면(둘 중 하나의 작업이라도 실패한다면), 하나의 단위로 묶여있는 모든 작업이 실패하게 만들어 기존 데이터를 보호한다. (롤백 시킨다.)
  • SQL 에서는 특정 쿼리를 실행했는데 부분적으로 실패하는 부분이 있다면, 전부 실패하도록 구현되어 있다.

 

❗ Consistency(일관성)

일관성은 데이터베이스의 상태가 일관되어야 한다는 성질이다.일관성은 하나의 트랜잭션 이전과 이후, 데이터베이스의 상태는 이전과 같이 유효해야 한다.다시 말해, 트랜잭션이 일어난 이후의 데이터베이스는 데이터베이스의 제약이나 규칙을 만족해야 한다는 뜻이다.

 

  • 예를 들어 ‘모든 고객은 반드시 이름을 가지고 있어야 한다’는 데이터베이스의 제약이 있다고 가정한다.
  • 다음과 같은 트랜잭션은 Consistency(일관성)를 위반한다.
    1. 이름 없는 새로운 고객을 추가하는 쿼리
    2. 기존 고객의 이름을 삭제하는 쿼리
  • 데이터베이스의 유효한 상태는 다를수 있지만, 데이터의 상태에 대한 일관성은 변하지 않아야 한다.
  • 이 예시는 ‘이름이 있어야 한다’ 라는 제약을 위반한다.
  • 따라서 예시 트랜잭션이 일어난 이후의 데이터베이스는 일관되지 않는 상태를 가지게 된다.

❗ Isolation(격리성, 고립성)

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

 

  • 예를 들어 게좌에 만 원이 있다고 가정한다.
  • 이 계좌로부터 계좌 B로 6천 원을, 계좌 C로 6천 원을 동시에 계좌 이체하는 경우, 계좌 B에 먼저 송금한 뒤 계좌 C에 보내는 결과와 동일해야 한다.
  • 동시에 트랜잭션을 실행한다고 해서 계좌 B와 C에 각각 6천 원씩 송금하여 마이너스 통장이 되는 것이 아니다.
  • 각각의 송금 작업을 연속으로 실행하는 것과 동일한 결과가 나타나야 한다.
  • 격리성을 지키는 각 트랜젝션은 철저히 독립적이기 때문에, 다른 트랜젝션의 작업 내용을 알 수 없다.
  • 그리고 트랜잭션이 동시에 실행될 때와 연속으로 실행될 때의 데이터베이스 상태가 동일해야 한다.

❗ Durability(지속성)

지속성은 하나의 트랜잭션이 성공적으로 수행되었다면, 해당 트랜잭션에 대한 로그가 남아야하는 성질을 말한다.만약 런타임 오류나 시스템 오류가 발생하더라도, 해당 기록은 영구적이어야 한다는 뜻.

 

  • 예를 들어 은행에서 게좌이체를 성공적으로 실행한 뒤에, 해당 은행 데이터베이스에 오류가 발생해 종료되더라도 계좌이체 내역은 기록으로 남아야 한다.
  • 마찬가지로 계좌이체를 로그로 기록하기 전에 시스템 오류 등에 의해 종료가 된다면, 해당 이체 내역은 실패로 돌아가고 각 계좌들은 계좌이체 이전 상태들로 돌아가게 된다.

 

트랜잭션의 Commit 과 Rollback

Commit

하나의 트랜잭션이 성공적으로 끝나서 데이터베이스가 일관성있는 상태에 있음을 의미

Rollback

트랜잭션의 원자성이 깨질 때, 즉 하나의 트랜잭션 처리가 비정상적으로 종료되었을 때의 상태를 뜻한다.

Rollback이 이뤄진다면 트랜잭션을 다시 실행하거나 부분적으로 변경된 결과를 취소 할 수 있다.

트랜잭션의 상태

트랜잭션은 논리적으로 5가지의 상태에 있을 수 있다.

 

  • Active
    • 트랜잭션이 현재 실행 중인 상태
  • Failed
    • 트랜잭션이 실행되다 오류가 발생해서 중단된 상태
  • Aborted
    • 트랜잭션이 비정상 종료되어 Rollback이 수행된 상태
  • Partially Committed
    • 트랜잭션의 연산이 마지막까지 실행되고 Commit이 되기 직전 상태
  • Committed
    • 트랜잭션이 성공적으로 종료되어 Commit 연산을 실행한 후의 상태

'CS > Computer Science' 카테고리의 다른 글

01/17 ORM  (0) 2023.01.17
01/13 깃과 깃허브  (0) 2023.01.13
01/10 SOLID  (0) 2023.01.11
01/09 디자인 패턴이란?  (0) 2023.01.11
01/06 컴파일러  (0) 2023.01.06