Computer Science

[DATABASE] Transaction과 ACID

emhaki 2023. 1. 12. 09:58
728x90
반응형
SMALL

트랜잭션(Transaction)

트랜잭션이란 여러 개의 작업을 하나로 묶은 실행 유닛을 말한다. 각 트랜잭션은 하나의 특정 작업으로 시작을 해 묶여 있는 모든 작업들을 다 완료해야 정상적으로 종료된다.

만약 하나의 트랜잭션에 속해있는 여러 작업 중에서 단 하나의 작업이라도 실패하면, 이 트랜잭션에 속한 모든 작업을 실패한 것으로 판단한다.

 

다시 말해 작업이 하나라도 실패를 하게 되면 트랜잭션도 실패이고, 모든 작업이 성공적이면 트랜잭션 또한 성공이다. 즉 트랜잭션은 성공 또는 실패라는 두 개의 결과만 존재한다.

 

계좌이체를 예를 들면, A에게 10만원을 보내면 나의 계좌에서 10만원을 뺴고, A의 계좌에 10만원을 추가하는 종합적인 과정이 트랜잭션이다. 만약 내 계좌에서 10만원이 빠졌는데, A의 계좌에 10만원이 추가되지 않는다면, 그 10만원은 세상에서 사라지게 된다. 계좌이체라는 트랜잭션이 발생할 때, 그 안전성을 보장할 수 있는 성질이 ACID이다. ACID는 데이터베이스 내에서 일어나는 하나의 트랜잭션(Transaction)의 안전성을 보장하기 위해 필요한 성질이다.

 

트랜잭션 특징 요약

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

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

ACID

ACID는 데이터베이스 내에서 일어나는 하나의 트랜잭션(transaction)의 안전성을 보장하기 위해 필요한 성질이다. ACID는 전자 상거래 서비스에서 필수적으로 적용되어야 할 성질이다. 

🔎 Atomicity(원자성)

원자성이란 트랜잭션이 안전성 보장을 위해 가져야 할 성질 중 하나이다.

원자성이란 시스템에서 한 트랜잭션의 연산들이 모두 성공하거나, 반대로 전부 실패되는 성질을 말한다.

원자성은 작업이 모두 반영되거나 모두 반영되지 않음으로써 결과를 예측할 수 있어야 한다.

 

계좌이체를 예로 들면,

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

🔎 Consistency(일관성)

일관성은 데이터베이스의 상태가 일관되어야 한다는 성질이다.

일관성은 하나의 트랜잭션 이전과 이후, 데이터베이스의 상태는 이전과 같이 유효해야 한다.

다시 말해, 트랜잭션이 일어난 이후의 데이터베이스는 데이터베이스의 제약이나 규칙을 만족해야 한다는 뜻이다.

 

예를 들어 '모든 고객은 반드시 이름을 가지고 있다'라는 데이터베이스 제약이 있다고 한다면

다음과 같은 트랜잭션은 Consistency(일관성)을 위반한다.

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

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

 

데이터베이스의 유효한 상태는 다를 수 있지만, 데이터의 상태에 대한 일관성은 변하지 않아야 한다. 위와 같은 예시는 '이름이 있어야 한다'라는 제약을 위반한다.

🔎 Isolation(격리성, 고립성)

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

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

 

예를 들어 계좌에 만 원이 있다고 가정해보자

이 계좌로부터 계좌 B로 6천원, C로 6천원을 동시에 이체하는 경우, 동시에 트랜잭션을 실행한다고 해서 마이너스 통장이 되는 것이 아니다. 격리성을 지키는 각 트랜잭션은 철저히 독립적이기 때문에, 다른 트랜잭션의 작업 내용을 알 수 없으며 트랜잭션이 동시에 실행될 때와 연속으로 실행될 때의 데이터베이스 상태가 동일해야 한다.

🔎 Durability(지속성)

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

 

예를 들어서 은행에서 계좌이체를 성공적으로 실행한 뒤에, 해당 은행 데이터베이스에 오류가 발생해 종료되더라도 계좌이체 내역은 기록에 남아야 한다.

마찬가지로 계좌이체를 로그로 기록하기 전에 시스템 오류 등에 의해 종료가 된다면, 해당 이체 내역은 실패로 돌아가고 각 계좌들은 계좌이체 이전 상태들로 돌아가게 된다. 

 

참고
https://velog.io/@shitaikoto/SQL-ACID

https://hanamon.kr/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98%EC%9D%98-acid-%EC%84%B1%EC%A7%88/

728x90
반응형