트랜잭션 : 데이터베이스의 논리적 연산단위.
하나의 업무단위로 묶여서 처리돼야 하는 거.
하나의 묶음.
아래는 데이터 모델링 진행 시 트랜잭션을 표현한 그림이다.
주문과 주문상세의 데이터는 함께 발생되는지, 아니면 독립적으로 발생되는지 알아야 한다.
위의 IE 표기법에서 필수적인 관계는 관계선 끝에 원을 붙이지 않는다.
바커 표기법은 필수일 땐 관계선을 실선으로 표기한다.
즉 위는 필수적인 관계이다.
위의 그림은 선택적 관계로 표기한 것이다.
주문과 주문상세는 일반적인 쇼핑몰 업무라면 선택적인 관계가 될 수 없다.
필수적인 관계가 맞다면 이는 어떻게 개발해야 할까?
하나의 트랜잭션으로 묶어서 처리해야 한다. 이는 ALL or NOTHING인 원자성이 보장되도록 개발한다는 것이다. 즉 커밋의 단위를 하나로 묶어야 함이다. 그래야만 그 전체가 실행되거나 취소 될 수 있다.
위의 의사 코드는 계좌이체하는 것을 표현한 것이다.
A 고객의 잔고에서 차감하고, B 고객의 잔고에서 가산해야 한다.
이를 모두 성공해야만 커밋이 수행되어 정상적인 데이터를 반영할 수 있다.
이는 애초에 서로 독립적으로 데이터가 발생될 수 없다. 따라서 각각의 INSERT문으로 개발되어서는 안 된다.
각각 호출 시 문제점은 중간에 에러가 발생되면 주문 API만 작동되어 커밋 되고 주문상세 API는 함께 수행되지 못할 수도 있다. 이는 주문과 주문상세에 잘못된 데이터가 발생할 수 있음을 의미한다.
위의 그림은 하나의 트랙잭션으로 처리한 사구문이다.
함께 발생하는 데이터이기에 이는 동시에 커밋 되거나 롤백이 된다.
잘못된 트랙재잭션 처리는 데이터 정합성의 문제를 야기하고 데이터 품질에도 큰 영향을 준다.