- 계좌이체 정상
- 계좌이체 문제 상황 - 커밋
- 계좌이체 문제 상황 - 롤백
- memberA의 돈을 memberB에게 2000원 계좌 이체 하는 트랜잭션을 실행해보자.
- 2번의 update 쿼리가 수행되어야 한다.
- set autocommit false로 설정한다.
- 아직 커밋하지 않았으므로 다른 세션에는 기존 데이터가 조회된다.
commit
명령어를 실행하면 데이터베이스에 결과가 반영된다.- 다른 세션에서도 memberA의 금액이 8000원으로 줄어들고, memberB의 금액이 12000원으로 증가한 것을 확인할 수 있다.
- 계좌이체를 실행하는 도중에 SQL에 문제가 발생한다.
그래서 memberA의 돈을 2000원 줄이는 것에는 성공했지만 memberB의 돈을 2000원 증가시키는 것에 실패한다.
- 두번째 SQL은 member_iddd라는 필드에 오타가 있다.
두번째 update 쿼리를 실행하면 SQL 오류가 발생하는 것을 확인할 수 있다.
- 여기서 문제는 memberA의 돈은 2000원 줄어들었지만 memberB의 돈은 2000원 증가하지 않았다는 점이다.
결과적으로 계좌이체는 실패하고 memberA의 돈만 2000원 줄어든 상황이다.
- 이 상황에서 강제로 commit을 호출한다면
계좌이체는 실패하고 memberA의 돈만 2000원 줄어드는 아주 심각한 문제가 발생한다.
- 이럴때는 롤백을 호출해서 트랜잭션을 시작하기 전 단계로 데이터를 복구해야 한다.
- 롤백을 사용한 덕분에 계좌이체를 실행하기 전 상태로 돌아왔다.
- memberA의 돈도 이전 상태인 1000원으로 돌아오고 memberB의 돈도 10000원으로 유지되는 것을 확인할 수 있다.
- 원자성 : 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공하거나 모두 실패해야 한다.
- 트랜잭션의 원자성 덕분에 여러 SQL 명령어를 마치 하나의 작업인 것 처럼 처리할 수 있다.
성공하면 한번에 반영하고 중간에 실패해도 마치 하나의 작업을 되돌리는 것 처럼 간단히 되돌릴 수 있다.
- 자동 커밋
만약 자동 커밋 모드로 동작하는데 계좌이체 중간에 실패하면 어떻게 될까?
쿼리를 하나 실행할 때마다 바로바로 커밋이 되어버리기 때문에 memberA의 돈만 2000원 줄어드는 심각한 문제가 발생한다.
- 따라서 이런 종류의 작업은 꼭 수동 커밋 모드를 사용해서 수동으로 커밋, 롤백 할 수 있도록 해야한다.
보통 이렇게 자동 커밋 모드에서 수동 커밋 모드로 전환 하는 것을 트랜잭션을 시작한다고 표현한다.