CS/DB

DB 트랜잭션 실습: 계좌이체

봄의 개발자 2023. 11. 16.
728x90
반응형

 

set autocommit false;
update member set money=10000 - 2000 where member_id = 'memberA';
update member set money=10000 + 2000 where member_id = 'memberB';

 

수동 커밋 모드로 변경한 후에 초기값을 세팅해준다.

 

각각 멤버의 돈을 확인하는 sql문
왼쪽, 오른쪽 db 서버를 두개 띄웠다. 이전의 과정은 왼쪽 서버에서 진행되었다.
수동 커밋 모드이기 때문에 commit을 해줘야 실제로 반영이 된다.

 

양쪽에 변화가 잘 반영되었다.


문제 발생

 

memberB에 대한 쿼리에서 예외가 발생한다. 이때 memberA에 대한 변화는 잘 반영되었다.

 

 

memberA의 값만 반영된 것을 확인할 수 있다.

 

  • 계좌 이체 실패 상황
    • memberB는 12000원이 되어야 함
  • 커밋 후

 

롤백

  • 위와 동일한 문제 발생

  • 롤백을 통해 계좌이체 실행 전으로 복구됨

롤백 수행

 

계좌이체 실행 전으로 복구되었음을 확인할 수 있다.

 

 

정리

  • 원자성: 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공하거나 모두 실패해야 한다.
    • 성공하면 한번에 반영, 중간에 실패해도 마치 하나의 작업을 되돌리는 것처럼 간단히 되돌릴 수 있다.
  • 오토 커밋: 쿼리를 하나 실행할 때마다 바로바로 커밋되어 버리기 때문에 계좌이체 중간에 실패하면 심각한 문제 발생한다.
  • 트랜잭션 시작: 이런 종류의 작업은 꼭 수동 커밋 모드를 사용해야한다.
    • 자동 커밋 모드 → 수동 커밋 모드: 트랜잭션 시작한다!
728x90
반응형

댓글