모델이 표현하는 트랜잭션의 이해

2023. 3. 5. 21:57SQL/SQL 전문가 가이드(2020 개정판)

트랜잭션은 데이터베이스의 논리적 연산단위입니다. 하나의 업무 단위로 묶여서 처리돼야 한다는 것이고, 이러한 업무 단위를 트랜잭션이라고 합니다.

고객이 상품을 구매하면서 발생하는 것이 주문입니다. 하나의 주문은 여러 개의 상품을 구매할 수 있습니다.

주문과 주문 상세의 데이터가 태생적으로 동시에 발생된다면, 당연히 계좌이체의 경우처럼 하나의 트랜잭션을 묶어서 처리해야 합니다. All or nothing인 원자성이 보장되도록 개발을 해야 합니다. 커밋(Commit)의 단위를 하나로 묶어야만 트랜잭션은 전체가 실행되거나 혹은 전체가 취소될 수 있습니다.

// A → B 계좌이체
Step1. 계좌이체API{잔고수정(고객번호=>A, 수정값=>현재잔고-이체금액);
				 잔고수정(고객번호=>B, 수정값=>현재잔고+이체금액);
                 commit();}

위 의사코드(Pseudo Code)는 A 고객이 B 고객에게 계좌이체하는 것을 표현한 것입니다. 계좌이체를 하기 위해서 먼저 A 고객의 잔고에서 이체금액을 차감하고, B 고객의 잔고에 이체금액을 가산해야 합니다. 데이터 발생 시 주문의 INSERT문과 주문상세의 INSERT문이 따로 개발되어서는 안 되는데, 이를 따로 개발한다면 어떤 문제가 발생될 수 있는지 확인해 보겠습니다.

// 고객의 주문 발생
Step1. 주문API{주문입력(주문번호=>110001, 고객명=>A, ...);
			 commit();}
Step2. 주문상세API{주문상세입력(주문번호=>110001, 상품번호=>1234, ...);
			 commit();}

함께 수행되어야 하는 주문의 INSERT API와 주문상세의 INSERT API를 각각 호출해야 합니다. 또한, 반드시 하나의 트랜잭션으로 처리되어야 합니다.

// 고객의 주문 발생
Step1. 주문API{주문입력(주문번호=>110001, 고객명=>A, ...);
	      주문상세입력(주문번호=>110001, 상품번호=>1234, ...);
              commit();}

업무적 트랜잭션보다 모델이 표현하는 트랜잭션은 태생 자체가 함께 발생하는 데이터이기에 재사용성의 이점도 없으므로 반드시 하나의 트랜젝션으로 처리해야 합니다.

'SQL > SQL 전문가 가이드(2020 개정판)' 카테고리의 다른 글

본질식별자 vs. 인조식별자  (0) 2023.03.07
Null 속성의 이해  (0) 2023.03.06
관계(Relationship)와 조인(Join)의 이해  (2) 2023.03.04
정규화(Normalization)  (0) 2023.03.03
식별자(Identifier)  (0) 2023.03.02