트랜잭션이란?

Yohan Kim·2023년 9월 20일
0

트랜잭션은 무엇인가?

데이터베이스는 초당 수백만개의 동시 요청을 수행할 수 있는 걸로 알려져 있습니다.
일반적으로, 이러한 요청들은 데이터 베이스에 있는 동일한 데이터를 조작할 수 있습니다.
예를들어 온라인 쇼핑 사이트에서 한정판 게임을 살려고 할 때, 여러 사용자들이 동시에 장바구니에 해당 게임을 담았고 그와 동시에 구매하기를 눌렀다고 가정해보겠습니다.
이 경우에 남아있는 수량은 초과도 과소도 아닌 정확하게 계산되어야합니다.
일반적으로 데이터베이스의 트랜잭션은 이런 상황에서 사용됩니다. 그래서 트랜젝션이 뭐지?

간단히 말하면, 데이터베이스 트랜잭션은 데이터베이스에서 수행되는 여러 작업의 연속이며(SQL문의 집합), 이러한 작업들은 모두 하나의 논리적인 작업 단위로 취급되어 전체가 완전히 수행되거나 전혀 수행되지 않습니다.

다시 말하면, 작업 중 일부만 수행되고 결과가 저장되는 경우는 절대 없습니다. 데이터베이스 트랜잭션이 진행 중일 때 데이터베이스 상태는 일시적으로 일관성이 없을 수 있지만
(데이터가 변했지만 조회시 이전의 값을 주고 있음. 취소될지 적용될지 모르기 때문에)
트랜잭션이 커밋되거나 종료될 때 변경 사항이 적용됩니다.

만약 우리가 토스에서 송금 기능을 개발한다고 생각해봅시다.
'계좌 A'에서 '계좌 B'로 5000원을 송금하려고 한다고 가정해 봅시다.
이 작업은 다음과 같은 간단한 작업으로 분해될 수 있습니다:

  1. '계좌 A'에서 '계좌 B'로 5달러를 이체하는 작업(레코드)를 생성합니다. 이것은 일반적으로 데이터베이스 트랜잭션의 시작 부분이라고 불립니다.
  2. '계좌 A'의 잔액을 읽습니다. (select)
  3. '계좌 A'의 잔액에서 5달러를 차감합니다. (update)
  4. '계좌 B'의 잔액을 읽습니다. (select)
  5. '계좌 B'에 5달러 크레딧을 추가합니다. (update)

이제, 만약 데이터베이스가 이 트랜잭션을 하나의 원자적인 단위(중간 상태가 없는 것을 의미함)로 실행하고, 시스템이 전원 장애로 인해 실패한다면, 이 트랜잭션은 취소되어 데이터베이스를 원래 상태로 되돌릴 수 있습니다.

일반적으로 "롤백"이라는 용어는 트랜잭션에 의해 수행된 모든 변경 사항을 취소하는 과정을 가리키며, "커밋"이라는 용어는 트랜잭션에 의해 수행된 영구적인 변경을 가리킵니다.

트랜잭션은 어떻게 동작하는가?

데이터베이스 트랜잭션이 어떻게 작동하는지를 이해하기 전에, 왜 데이터베이스 트랜잭션이 필요한지 먼저 살펴보겠습니다.

  1. 시스템 장애는 피할 수 없으며 이때, 트랜잭션은 결과를 신뢰성 있고 일관성 있게 보장하는 방법을 제공합니다. 트랜잭션 도중에 실패했다면, 오류지점에서 트랜잭션이 완전히 취소되고 데이터베이스는 실패하기 전의 상태로 되돌아가야합니다.
  2. 데이터베이스 서버에 여러 동시 요청이 동시에 접근하여 동일한 기본 데이터를 변경할 때, 트랜잭션은 충돌을 피하기 위해 요청을 서로 격리시켜야 합니다.

데이터베이스 트랜잭션은 수명 주기 동안 여러 상태를 거칩니다. 이러한 상태를 "트랜잭션 상태" 라고 하며 일반적으로 다음 중 하나입니다:

  1. 활성 상태 (Active states): 트랜잭션의 실행 중에 처음 상태입니다. 트랜잭션이 활성 상태인 동안에는 해당 지시문(읽기 또는 쓰기 작업)이 수행됩니다.

  2. 부분 커밋 상태 (Partially committed): 이 상태에서 변경이 실행되었지만 데이터베이스는 변경 사항을 디스크에 아직 커밋하지 않은 상태입니다. 이 상태에서 데이터는 메모리 버퍼에 저장되고 버퍼는 아직 디스크에 기록되지 않았습니다.

  3. 커밋된 상태 (Committed): 이 상태에서 모든 트랜잭션 업데이트가 영구적으로 데이터베이스에 저장됩니다. 따라서 이 지점 이후에는 트랜잭션을 롤백할 수 없습니다.

  4. 실패 상태 (Failed): 트랜잭션이 활성 상태나 부분 커밋 상태에서 실패하거나 중단된 경우 이 상태로 진입합니다.

  5. 종료 상태 (Terminated state): 이는 커밋되거나 중단된 상태 이후의 마지막 트랜잭션 상태입니다. 이것은 데이터베이스 트랜잭션 수명 주기의 끝을 나타냅니다.

ACID 속성이란 무엇이며, 왜 중요한가요?

관계형 데이터베이스에서 트랜잭션은 원자적(Atomic), 일관적(Consistent), 고립적(Isolated), 지속적(Durable)이어야 합니다.
일반적으로 이러한 속성들을 줄여서 ACID라고 불립니다.
ACID 속성은 데이터베이스 트랜잭션이 신뢰성 있게 처리되도록 보장합니다.
이 섹션에서는 이러한 속성들이 애플리케이션에 어떤 의미를 가지는지 조금 더 자세히 알아보겠습니다.

원자성 (Atomicity)

트랜잭션의 관점에서 원자성은 '전부 또는 아무것도 아님'을 의미합니다.
트랜잭션이 커밋되면, 데이터베이스는 트랜잭션을 성공적으로 완료하거나 원래의 상태로 롤백하여 복원합니다.
예를 들어, 온라인 티켓 예매 애플리케이션에서 예매는 고객을 위한 좌석 예약 및 결제 두 개의 별개의 작업으로 이루어질 수 있습니다.
트랜잭션은 예매가 완료되면 이러한 독립적인 두 작업이 동일한 트랜잭션 내에서 발생함을 보장합니다.
이 중 어느 하나의 작업이 실패하면 전체 트랜잭션이 롤백되고 예매는 다른 트랜잭션에서 차지하려고 시도할 수 있도록 해제됩니다.

만약 공연 티켓을 구매하는데, 예매하고 결제하는데 쓰이는 두 쿼리가 원자성이 없다면

  1. A라는 사람이 예매요청이 일어남
  2. B라는 사람의 예매요청이 일어남
  3. 이 때 갑자기 인터넷 선이 살짝 흔들려서 A라는 사람의 네트워크가 불안정해짐
  4. B라는 사람의 결제 요청이 일어남
  5. A라는 사람의 결제 요청이 일어남
    와 같은 상황에서 예매는 A가 했지만, 결제는 B라는 사람이 한 경우가 생겨버립니다.

이럴 경우 어떤 사람에게 티켓을 줄 지 결정하는 문제에 더해서
티켓을 못 받은 사람의 돈을 환불 까지 해야하는 상황이 생기는 것 입니다.

트랜잭션이 있었다면
1. A라는 사람이 예매요청이 일어남
2. A라는 사람의 트랜잭션이 생성
3. B라는 사람의 예매요청이 일어남
4. B라는 사람의 트랜잭션이 생성
5. 이 때 갑자기 인터넷 선이 살짝 흔들려서 A라는 사람의 네트워크가 불안정해짐
6. B라는 사람의 결제 요청이 일어남
7. B라는 사람의 트랜잭션이 종료됨
8. A라는 사람의 결제 요청이 일어남
9. A라는 사람의 결제가 실패되고, 트랜잭션이 실패 상테로 변함
10. A의 얘매취소가 이루어짐

일관성 (Consistency)

트랜잭션을 사용하는 주요 이점 중 하나는 성공하든 실패하든 데이터 무결성을 유지하는 것입니다. 트랜잭션은 데이터베이스 엔진이 허가한 방식으로만 관련 데이터를 변경할 수 있으며, 이로써 데이터를 일관성 있게 유지됩니다.
예를 들어, 온라인 뱅킹 앱에서 사용자가 돈을 입금할 때, 그들은 잔액을 확인할 때 이 입금 결과가 즉시 반영되기를 원합니다. 그래서 그들의 돈이 소실되지 않았음을 보장하기 위함입니다. 강력한 트랜잭션 일관성을 유지하면 은행에는 현재의 금액보다 더 많거나 더 적은 금액이 있지 않는 것처럼 보여야 합니다.

일관성

트랜잭션 사용의 주요 이점 중 하나는 성공 여부에 관계없이 데이터 무결성을 유지한다는 것입니다. 트랜잭션은 데이터베이스 엔진에서 승인한 방식으로만 영향을 받는 데이터를 변경할 수 있으므로 데이터에 대한 일관된 보기가 항상 유지됩니다. 예를 들어, 사용자는 온라인 뱅킹 앱에 돈을 입금할 때 잔액을 볼 때 즉시 입금 결과가 반영되기를 원합니다. 그들의 돈이 손실되지 않았는지 확인하기 위해. 강력한 거래 일관성으로 인해 은행에 있는 총 자금이 실제보다 많거나 적은 것처럼 보여서는 안 됩니다.

최근 몇 년 동안 NoSQL 데이터베이스가 인기를 얻고 있습니다. 이러한 데이터베이스 중 일부는 ACID(원자성, 일관성, 고립성, 지속성) 준수를 제공하지만, 많은 데이터베이스는 그렇지 않으며, 대신 스냅샷 격리(Snapshot Isolation)와 같은 프로세스를 제공하거나 데이터 일관성을 일부 포기합니다. 애플리케이션을 설계하고 NoSQL 데이터베이스를 고려할 때, 데이터 트랜잭션 처리 방법과 데이터 무결성 요구 사항을 충족하는지 주의 깊게 확인해야 합니다.

격리

동시에 실행되는 여러 동시 트랜잭션의 경우 각 트랜잭션은 동시에 실행되는 다른 트랜잭션에 영향을 주지 않고 독립적으로 유지되어야 합니다. 대부분의 데이터베이스 시스템에서는 트랜잭션 순서가 미리 알려져 있지 않습니다. 대신 트랜잭션은 병렬로 실행되며, 한 트랜잭션의 결과가 다른 트랜잭션의 결과에 영향을 미치지 않도록 하기 위해 일부 형태의 데이터베이스 잠금이 활용됩니다. 일반적으로 데이터베이스는 여러 격리 수준을 제공합니다. 트랜잭션 무결성의 정도를 제어합니다.

내구성

내구성은 성공적인 트랜잭션 커밋이 영구적으로 유지된다는 것을 의미합니다. 이를 달성하기 위해 성공한 각 트랜잭션에 대한 항목이 데이터베이스 트랜잭션 로그에 추가됩니다.

출처

https://fauna.com/blog/database-transaction

profile
안녕하세요 반가워요!

0개의 댓글