데이터를 가공하다보면 하나의 API를 통해 여러 데이터를 한번에 수정하거나 생성하고 삭제하는 경우가 발생하기 마련이다. 이러한 API를 요청하여 서버가 이를 수행하던 도중 서버에 문제가 생겨 종료된다면 어떤 일이 발생할까?
은행의 송금 시스템을 예로 들어보자. 만약 A가 B에게 100만원을 송금하였다. 이 과정에서 송금 API가 요청된 셈이다. 중간에 예상치 못한 서버의 오류가 발생하여 서버가 종료되었다. A의 게좌에서는 100만원이 빠져나갔지만, B의 계좌에는 100만원이 들어오지 않은 상황이 발생할 것이다.
이렇게 여러 데이터를 한번에 가공하는 API를 요청할 때에는 트랜잭션으로 이러한 상황을 보호해주어야 한다. 이전에 트랜잭션에 대해 정리하였지만, 다시 한번 정리해보려고 한다.
트랜잭션은 하나의 작업을 수행하기 위해 필요한 DB의 연산들을 모아놓은 것으로, DB에서의 논리적인 작업 단위이고, 장애가 발생했을 경우에 데이터를 복구하는 작업의 단위이다.
트랜잭션의 특징은 크게 4가지로 나타낼 수 있는데, 이 4가지 특징들의 앞 글자를 따서 ACID 특징이라고 부른다.
트랜잭션을 구성하는 연산들이 하나의 연산처럼 동작해야 함을 의미한다. 만약 중간에 문제가 발생하여 트랜잭션의 연산 중 일부만 수행되었을 경우, 이전의 상태로 rollback된다.
트랜잭션이 성공적으로 수행된 이후에도 DB가 일관성 있는 상태를 유지해야 함을 의미한다. 이는 트랜잭션 수행 이전의 DB가 일관성이 유지된 상태였을 경우, 트랜잭션 수행이 끝난 이후에도 일관성이 유지되어야 한다는 의미이다.
수행 중인 트랜잭션이 완료되기 전까지는 다른 트랜잭션이 현재 변경된 결과에 접근할 수 없음을 의미한다. 시스템에서 여러 개의 트랜잭션이 동시에 수행되지만, 이 과정에서 각 트랜잭션의 중간 결과에는 서로 접근할 수 없다.
트랜잭션이 성공적으로 완료된 후 DB에 반영한 수행 결과는 어떠한 경우에도 손실되지 않고 영구적이어야 함을 의미한다.
트랜잭션에는 commit, rollback 연산이 존재한다.
Commit 연산은 트랜잭션을 구성하는 모든 연산이 성공적으로 수행된 이후에 DB에 반영하는 연산이다.
Rollback 연산은 트랜잭션을 구성하는 연산들을 수행하던 도중 문제가 발생하였을 경우에, 트랜잭션을 수행하기 이전의 DB로 되돌려 놓는 연산이다.