본문 바로가기

개발 이야기/기타

[mysql]트랜잭션

트랜잭션이란?

 

트랜잭션은 작업의 완전성을 보장해 주는 것으로 논리적인 작업셋을 모두 완벽하게 처리하거나, 하나라도 처리하지 못했을 경우 모두원 상태로 복구해서 작업의 일부만 적용되는 것을 막는 것이다. 쉽게 예를 들어 설명해보면 아래와 같은  순서로 작업이 진행된다고 가정해보자. 

 

1. 게임 아이템 결제를 수행한다.

2. 결제 내역을 저장한다.

3. 해당 아이템을 지급한다.

 

트랜잭션은 위와 같은 여러 과정을 하나의 행위로 묶고 처리 과정 중 한 가지라도 실패할 경우 전체 과정을 초기화 함으로서 데이터의 무결성을 보장한다. 꼭 여러 개의 변경 작업을 수행하는 쿼리가 조합되었을 때만 의미 있는 것이 아니라 하나의 논리적인 작업셋에 하나의 쿼리가 있든 두 개 이상의 쿼리가 있든 상관없이 논리적인 작업 셋 자체가 모두 적용되거나 또는 아무것도 적용되지 않아야 함을 보장해 주는 것이다.

 

트랜잭션의 4가지의 특징인 ACID

  •  원자성(Atomicity)
    트랜잭션 범위내에 있는 모든 요청이 모두 실행되거나 또는 모두 실행이 취소됨을 보장한다. 전부 다 성공적으로 실행되던가 하나라도 실패하면 전부 적용되지 않거나

  • 일관성(Consistency)
    트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지하는 것을 의미한다.

  • 고립성(Isolation)
    다른 트랜잭션과 독립적으로 실행되어야 하며, 다른 트랜잭션이 동일한 데이터에 동시에 접근할 경우 알맞게 접근을 제어해야 한다.

  • 지속성(Durability)
    트랜잭션이 성공적으로 수행되면 그 결과는 영원히 반영되어야 한다. 

 

예를 들어 위 과정에 있어서 정상적으로 처리 된다면 사용자는 게임 아이템의 금액만큼 결제를 하고 해당 아이템을 지급받아야 한다. 하지만 서비스에 어떤 문제가 생겨 결제만 되어버리고 아이템이 지급되지 않으면 어떻게 될까? 실제로 온라인게임상에서 결제는 하였으나 아이템을 지급받지 못하는 문제가 종종 생기고는 한다. 만약 위에 3가지 과정을 하나의 트랜잭션으로 묶어 처리한다면 1번과 2번 과정 성공 후 3번 과정에 문제가 생긴다면 앞서 처리한 1번과 2번 과정 또한 취소 처리되는 것이다. 3가지 과정이 모두 정상적으로 처리된다면 해당 정보가 물리적 저장소에 정상적으로 기록되어야 하며 시스템이 일시적으로 정지되더라도 그 정보는 계속 유지되어야 하며 시스템이 정상적으로 구동될 때 다시 사용 가능해야 한다. 만약 위의 과정을 한 명이 아니라 여러 명이 동시에 요청하게 되더라도 각 트랜잭션이 알맞은 순서로 실행되어야 한다.