[SQL] 트랜잭션
트랜잭션이란?
트랜잭션은 DB의 논리적 연산단위이며, 하나의 업무 단위로 묶여서 처리되는 것이라고 할 수 있다. 예로 계좌이체가 있는데, 돈을 보내는 사람의 계좌에서 이체금액을 차감하고, 돈을 받는 사람의 계좌에 이체금액을 가산한다. 계좌이체라는 업무는 이러한 2가지 단계로 진행되며, 데이터 정합성을 위해 위 작업이 전부 실행 또는 전부 취소되야 한다.
데이터 모델링에서의 트랜잭션 표현
트랜잭션을 쿼리로 어떻게 작성하는지 알아보기에 앞서 데이터 모델링에서 트랜잭션을 어떻게 표현하는지 살펴보자.
고객이 상품을 구매하면서 발생하는 것이 주문이다. 또한 하나의 주문은 여러 개의 상품을 구매할 수 있다. 그렇다면 여기서 우리는 주문과 주문상세의 데이터는 함께 발생되는가, 아니면 독립적으로 발생되는가를 생각해보아야 한다. 일반적인 업무기준으로 보았을 때 주문이 발생하면 주문상세 데이터도 함께 발생된다. 때문에 위 모델처럼 두 엔터티는 필수적 관계여야하며, 이러한 모델이 트랜잭션이 발생하는 모델이라고 할 수 있다. 즉, 트랜잭션이 발생하려면 모델간의 관계는 필수적이여야하며, 바커 표기법에서의 관계선은 위와 같이 실선으로 표기해 트랜잭션을 표현한다.
쿼리에서의 트랜잭션
모델링에서의 트랜잭션은 알아봤고, 그렇다면 쿼리에서 트랜잭션은 어떻게 작성하면 되는 것일까? All or Nothing인 원자성이 보장되도록 작성되면 된다. 즉, 커밋의 단위를 하나로 묶어야 함을 의미하며 전체가 실행되거나 혹은 취소되도록 작성해야한다. 아래 예제 코드를 보자.
1
2
3
4
5
계좌이체API{
잔고수정(고객번호 => A, 수정값 => 현재잔고 - 이체금액);
잔고수정(고객번호 => B, 수정값 => 현재잔고 + 이체금액);
commit();
}
위 의사코드(Pseudo Code)는 A고객이 B고객에게 계좌이체하는 것을 표현한다. 계좌이체를 하기 위해서는 먼저 A고객의 잔고에서 이체금액을 차감하고, B고객의 잔고에 이체금액을 가산해야 한다. 중요한 것은 잔고를 차감하고 가산하는 단계가 모두 완료된 후에 커밋을 수행하는 것이다. 잔고 차감/가산 단계가 모두 성공해야하지만 커밋이 수행되어 정상적인 데이터를 반영할 수 있다.
읽어주셔서 감사합니다. 😊
Reference
SQL 전문가 가이드 - Kdata 한국데이터산업진흥원
