트랜잭션

여러 개의 작업을 하나로 묶은 실행 유닛입니다.

1. 각 트랜잭션은 하나의 특정 작업으로 시작

2. 묶여 있는 모든 작업들을 다 완료해야 정상적으로 종료

3. 만약 하나의 트랜잭션에 속해있는 여러 작업 중에 단 하나의 작업이라도 실패할 경우, 이 트랜잭션에 속한 모든 작업을 실패로 간주

 

 

ACID

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

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

 

  • Atomicity
  • Consistency
  • Isolation
  • Durability

 

Atomicity

원자성이란 트랜잭션에 속해 있는 모든 작업이 전부 성공하거나 전부 실패해서 결과를 예측할 수 있어야 합니다.

하나의 단위로 묶여있는 여러 작업이 부분적으로 실행된다면, 업데이트가 일어났지만 누가 업데이트 했는지 알 수가 없습니다.

그리고 업데이트의 정보가 누락되는 등 데이터가 오염될 수 있습니다.

 

예를 들어, A -> B 로 계좌이체를 하려고 하는데, 만약 B에서 입금이 되지 않았는데 어디서 문제가 발생했는지 알 수 없다면

그거는 사라지는 돈이 됩니다.

 

이런 상황을 대비해서 작업이 실패한다면 계좌 A에서 출금하는 작업을 포함해 모든 작업이 실패로 돌아가야 한다는 것이

원자성입니다.

 

Consistency

일관성이란 데이터베이스의 상태가 일관되야 한다는 성질입니다.

하나의 트랜잭션 이전, 이후의 데이터베이스 상태가 같아야 한다는 겁니다.

 

예를 들어, 모든 고객은 반드시 이름을 가지고 있어야 한다는 데이터베이스 제약이 있다고 가정해보겠습니다.

다음과 같은 트랜잭션은 일관성을 위반합니다.

 

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

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

 

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

 

 

Isolation

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

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

 

예를 들어, 계좌에 만원이 있다고 가정해보겠습니다.

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

 

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

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

 

Durability

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

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

 

예를 들어, 은행에서 계좌이체를 성공적으로 마친 후 , 해당 은행 데이터베이스에서 오류가 발생되어 종료되어도

계좌이체 내역은 기록으로 남아있어야 합니다.

 

만약 계좌 이체를 로그로 기록하기도 전에 시스템 오류 등으로 종료 된다면,

해당 이체 내역은 실패로 돌아가 계좌이체 이전 상태들로 돌아가게 됩니다.

'스터디' 카테고리의 다른 글

프레임워크와 라이브러리  (0) 2022.08.09
스키마와 쿼리 디자인  (0) 2022.08.04
데이터베이스  (0) 2022.08.04
PostMan  (0) 2022.08.04
REST API  (0) 2022.08.03

+ Recent posts