안녕하세요. IT 엘도라도 에 오신 것을 환영합니다.
글을 쓰는 것은 귀찮지만 다시 찾아보는 것은 더 귀찮습니다.
완전한 나만의 것으로 만들기 위해 지식을 차곡차곡 저장해 보아요.   포스팅 둘러보기 ▼

데이터베이스 (Database)

[Database] 트랜잭션 (Transaction)

피그브라더 2020. 6. 18. 23:58

이런 상황을 상상해 보자. 친구에게 돈을 보내기 위해 ATM기를 찾아간 것이다. 카드를 넣고, 친구의 계좌번호를 누르고, 송금할 금액을 입력하였다. 그런데 송금이 되던 도중 갑자기 ATM기의 화면이 꺼져버렸다. 내 돈이 빠져나갔는지 확인하기 위해서 핸드폰을 보니 출금 알림이 와있었다. 이때 드는 생각은 무엇일까? 필자라면, "혹시 내 통장에서만 돈이 빠져나가고 친구에겐 송금이 안 됐으면 어떡하지?"라고 생각하면서 불안해할 것 같다. 하지만 아주 잘 갖춰진 은행의 데이터베이스 시스템은 그러한 현상을 웬만해서는 용납하지 않는다. 바로 트랜잭션(Transaction)이라는 것 때문이다. 이에 대해 한 번 알아보자.

 

1. 트랜잭션의 개념

트랜잭션(Transaction)이란 데이터베이스를 대상으로 수행하는 일련의 연산들로 이뤄진 하나의 작업 단위를 의미한다. 여기서 데이터베이스를 대상으로 수행하는 연산이라 함은 바로 CRUD(Create, Read, Update, Delete)를 가리키며, 이러한 연산들이 하나의 작업 단위를 이뤄서 하나의 논리적인 기능을 수행하게 된다.

 

예를 들어, 고객이 온라인 주문을 시도했다고 상상해 보자. 그러면 먼저 데이터베이스에서 해당 고객의 정보가 이미 존재하는지 확인해야 한다(Read). 만약 존재한다면 해당 고객의 주문 이력 정보를 수정해주고(Update), 그렇지 않다면 해당 고객의 정보를 새로 생성해줘야 한다(Create). 그러고 나서 해당 고객에 연결된 주문의 정보를 새로 생성해주면(Create) 이 과정은 끝이 난다. 이러한 연산들은 '온라인 주문 처리'라는 하나의 논리적 기능을 수행하기 위한 것들임을 알 수 있고, 따라서 개발자는 이러한 연산들을 묶어서 하나의 트랜잭션으로 정의하게 된다.

 

그렇다면, 트랜잭션은 왜 필요한 것일까? 곧이어 알아보겠지만, 하나의 트랜잭션으로 정의되는 일련의 연산들은 하나라도 실패하면 전부 다 실패한 것과 같이 처리가 된다. 따라서 중간 연산까지만 수행이 되어 데이터들의 상태가 모순이 생기는 일은 발생하지 않게 된다. 이처럼, 트랜잭션을 정의하는 것의 본질적인 목적은 모순이 없고 신뢰할 수 있는 안전한 데이터들을 구축하는 것이다. 따라서 개발자는 어디부터 어디까지를 하나의 트랜잭션으로 정의할 것인가에 대해서도 신중히 고려해야 한다.

 

2. 트랜잭션의 특징 (ACID)

앞서 말했듯, 하나의 트랜잭션으로 정의되는 일련의 연산들은 모순이 없고 신뢰할 수 있는 안전한 데이터들을 구축할 수 있어야 한다. 이를 보장하기 위해, 트랜잭션은 다음과 같은 네 가지 성질을 가져야 한다. 각각의 앞 글자를 따서 ACID라고 부른다.

 

  • 원자성 (Atomicity) : 트랜잭션의 연산들은 전부 다 성공하거나 전부 다 실패해야 한다. 즉, 일부 연산만 성공하는 것은 불가능하며, 하나라도 실패하는 경우에는 전부 다 실패한 것처럼 처리한다. 예를 들어, 내 통장에서 돈이 빠져나갔다면 반드시 친구에게 송금도 완료가 되었어야 한다.
  • 일관성 (Consistency) : 트랜잭션이 완료된 이후에도 데이터베이스의 데이터들은 일관된(Consistent) 상태를 유지해야 한다. 일관된 상태라는 것은 데이터들의 상태가 전혀 모순이 없는 것을 말한다. 예를 들어, 송금이 완료된 후에도 내 통장과 친구 통장의 잔고 합은 반드시 동일해야 한다.
  • 독립성 (Isolation) : 트랜잭션의 연산들이 수행되는 동안에는 또 다른 트랜잭션이 이 과정에 끼어들 수 없어야 한다. 즉, 현재 수행 중인 트랜잭션의 결과는 이 트랜잭션이 완료된 이후에야 참조가 가능하다. 예를 들어, 어떤 트랜잭션이 내 통장에 대한 연산을 수행하고 있다면 이 트랜잭션이 완료될 때까지 다른 트랜잭션은 내 통장에 대한 참조가 불가능하다.
  • 지속성 (Durability) : 트랜잭션이 완료되면 그 결과는 반드시 지속 가능해야 하며, 시스템에 어떠한 문제가 생기더라도 복구가 가능하도록 해야 한다. 이를 위해 로그를 반드시 남기게 된다.

 

3. 트랜잭션의 연산

  • Commit 연산 : 트랜잭션의 연산들이 모두 성공적으로 수행되었고 데이터베이스도 일관된 상태에 놓여 있을 때, 트랜잭션이 완료되었음을 알리면서 로그와 함께 그 수행 결과를 데이터베이스에 반영해주는 연산을 의미한다.
  • Rollback 연산 : 트랜잭션의 연산들을 수행하는 과정에서 오류가 발생하여 데이터베이스의 일관성이 깨졌을 때, 해당 트랜잭션의 모든 연산들을 취소함으로써 원자성을 확보하는 연산을 의미한다. 이후 트랜잭션을 다시 시작할 수도 있고, 아예 종료할 수도 있다.

 

4. 트랜잭션의 상태

트랜잭션은 반드시 다음과 같은 다섯 개의 상태 중 하나에 놓여 있다.

 

 

  • 활동 (Active) : 트랜잭션의 연산들을 수행 중인 상태
  • 부분 완료 (Partially Committed) : 트랜잭션의 마지막 연산까지 완료되었고, Commit 연산을 수행하기 직전인 상태
  • 실패 (Failed) : 트랜잭션의 연산 수행이 오류 발생으로 인해 중단된 상태
  • 철회 (Aborted) : 트랜잭션의 수행이 실패하여 Rollback 연산을 수행한 상태
  • 완료 (Committed) : 트랜잭션의 수행이 완료되어 Commit 연산을 수행한 상태

'데이터베이스 (Database)' 카테고리의 다른 글

[Database] 인덱스 (Index), B-Tree  (0) 2020.06.23
[SQL] 서브쿼리 (Subquery)  (0) 2020.01.07