서버 개발을 할 때 데이터베이스와 관련된 프로그래밍을 할 때 가장 중요하고 신경써야 하는 부분 중에 하나는 데이터베이스 트랜잭션 처리입니다.


특히, 마이크로 서비스 아키텍쳐로 이뤄진 서비스의 트랜잭션 처리는 정말 쉽지 않은 일입니다.



예를 들어 쿠폰 관련 Domain을 처리하는 서비스 A 가 있고, 결제 관련 Domain을 처리하는 서비스 B 가 나누어져 있다고 생각하면 쿠폰을 사용해서 결제를 하다가 중간에 실패를 하였는데 쿠폰이 사용되어 버리면 아주 큰 문제가 발생합니다. 여기서 각 서비스별로 DB connection이 각각 이뤄지기 때문에 하나의 DB connection으로 작업할 때 보다 복잡도가 올라갑니다. 일단 이런 복잡한 경우는 뒤로 미뤄보고, 데이터 베이스 트랜잭션이 무엇이고 이와 관련된 성질인 ACID에 대해서 살펴보려고 합니다. 



트랜잭션이란?


하나의 논리적 작업 단위를 구성하는 일련의 연산들의 집합을 트랜잭션입니다. 즉, 작업을 묶어놓은 단위입니다.



트랜잭션의 예로 위에 예보다는 대부분 은행에 입출금을 하는 것을 예시로 많이 사용합니다.



예를 들어, 우리은행의 A의돈을  =>국민은행 계좌를 사용하는 B에게 돈을 입금했을 때 A의 돈은 먼저 우리은행 DB에 저장이 되고(출금 기록을 저장), 그 후에 우리은행 DB에서 국민은행 DB에 B의 계좌로 이동할 것 이다. 

즉, 1) 우리은행 DB 작업  2) 국민은행의 DB 작업이 있다. 만약에 우리은행에서 국민은행으로 데이터를 전송 중 실패한다면 다시 A의 통장에 돈을 넣어줘야 한다. 

우리은행에서 A의 계좌에서는 돈이 없어졌는데 국민은행 B의 계좌로 입금된 기록이 없다면 현재 은행 시스템은 존재하지 않을것입니다.( 모두 직접 돈을 가져다 주겠죠.)

(위의 예시 과정은 제가 추측한 것이므로 실제 구현과는 다를 가능성이 큽니다.)


트랜잭션은 주로 ACID 성질이라고 하는 다음의 네가지 성질로 설명됩니다. 

이 중 하나라도 해당되지 않으면 트랜잭션이 잘 처리되었다고 할 수 없습니다.


Atomicity(원자성)

이체 과정 중에 트랜잭션이 실패하게 되어 예금이 사라지는 경우가 발생해서는 안 되기 때문에 DBMS는 완료되지 않은 트랜잭션의 중간 상태를 데이터베이스에 반영해서는 안 된다. 즉, 트랜잭션의 모든 연산들이 정상적으로 수행 완료되거나 아니면 전혀 어떠한 연산도 수행되지 않은 상태를 보장해야 한다. atomicity는 쉽게 'all or nothing' 특성으로 설명된다. 즉, 가장 작은 작업 단위이기 때문에 분리할 수 없기 때문에 수행이 되었거나 안되었거나 둘 중 하나라는 성질을 가지고 있습니다.

Consistency(일관성)

고립된 트랜잭션의 수행이 데이터베이스의 일관성을 보존해야 한다. 즉, 성공적으로 수행된 트랜잭션은 정당한 데이터들만을 데이터베이스에 반영해야 한다. 트랜잭션의 수행을 데이터베이스 상태 간의 전이(transition)로 봤을 때, 트랜잭션 수행 전후의 데이터베이스 상태는 각각 일관성이 보장되는 서로 다른 상태가 된다. 트랜잭션 수행이 보존해야 할 일관성은 기본 키, 외래 키 제약과 같은 명시적인 무결성 제약 조건들뿐만 아니라, 자금 이체 예에서 두 계좌 잔고의 합은 이체 전후가 같아야 한다는 사항과 같은 비명시적인 일관성 조건들도 있다.

Isolation(독립성)

여러 트랜잭션이 동시에 수행되더라도 각각의 트랜잭션은 다른 트랜잭션의 수행에 영향을 받지 않고 독립적으로 수행되어야 한다. 즉, 한 트랜잭션의 중간 결과가 다른 트랜잭션에게는 숨겨져야 한다는 의미인데, 이러한 isolation 성질이 보장되지 않으면 트랜잭션이 원래 상태로 되돌아갈 수 없게 된다. Isolation 성질을 보장할 수 있는 가장 쉬운 방법은 모든 트랜잭션을 순차적으로 수행하는 것이다. 하지만 병렬적 수행의 장점을 얻기 위해서 DBMS는 병렬적으로 수행하면서도 일렬(serial) 수행과 같은 결과를 보장할 수 있는 방식을 제공하고 있다. 각각의 트랜잭션은 독립적으로 묶이기 때문에 A,B,C 라는 트랜잭션이 있다면 각각이 독립적이어서 A가 처리가 된것이나 중간에 실패하여 처리가 되지 않은것과 B,C 는 독릭적이라는 의미입니다.

Durability(지속성)

트랜잭션이 성공적으로 완료되어 커밋되고 나면, 해당 트랜잭션에 의한 모든 변경은 향후에 어떤 소프트웨어나 하드웨어 장애가 발생되더라도 보존되어야 한다. 지속성이 보존 되지 않는다면 원자성 또한 파괴됩니다. 일주일 뒤에 확인했더니 출금한 기록은 사라지고, 입금한 기록만 있다면 아주 끔찍할 것 입니다.



데이터 베이스에서는 이러한 트랜잭션을 지원하기 위하여 UNDO, REDO 같은 기능을 구현하였고, 또 이는 DBMS가 어떻게 구현해야에 따라서 차이가 있습니다.


이와 관련된 자료 중에 아주 좋은 글이 있어서 추천드립니다. 혹시, DBMS 가 어떻게 트랜잭션을 관리하는지 궁금하신분이 있다면 읽어보시면 좋을 것 같습니다.


https://d2.naver.com/helloworld/407507



- 참고한 글


나무위키


https://d2.naver.com/helloworld/407507




혹시, 관련해서 피드백이 있다면 언제든지 댓글로 남겨주시면 감사하겠습니다.


감사합니다.








'프로그래밍 > DB(DataBase)' 카테고리의 다른 글

데이터베이스 트랜잭션과 ACID  (0) 2018.12.28

+ Recent posts