[Spring] 트랜잭션(2)

JJoSuk·2023년 6월 14일
0

본 프로젝트 자료는 김영한님의 스프링 DB 1편 - 데이터 접근 핵심 원리을 참고 제작됐음을 알립니다.

트랜잭션 - DB 예제4 - 계좌이체

계좌이체라는 예제를 만들어 다음과 같은 3가지 상황을 알아볼려고 한다.

  • 계좌이체 정상
  • 계좌이체 문제 상황 - 커밋
  • 계좌이체 문제 상황 - 롤백

계좌이체 정상

일단 기본 데이터가 입력된 테이블을 준비한다.

멤버A 와 멤버B 의 통장에 10000원을 세팅한다.

이제 계좌이체를 실행하는 상황을 만들어본다.

여기서 수동 커밋으로 만든 상태이기에 커밋만 입력하면 결과가 반영된다.

사용자 A, B 모두 정상적으로 이체가 완료되어 같은 화면인 것을 확인했다.

계좌이체 문제 상황

만약 개발자가 코드 입력 도중 오타가 발생하여 문제가 발생한 상태라면 어떻게 될까?

다시 기본 테이블 상태로 돌아가자.

여기서 A가 B에게 2000원 을 입금했는데 B의 코드에 오타가 발생했다.

member_id 가 member_iddd 로 잘못 입력되었다.

이런 상태에서 커밋을 입력하게 될 경우, 순차적으로 입력되는 시스템이기에 첫 번째는 성공으로 간주하고 데이터를 반영했지만, 두 번째는 실패로 데이터 반영에 실패했다.

A 사용자의 2000원 돈만 사라지게 된다.

오토커밋을 방금과 같이 사용하면 편리하나 이런 사소한 실수가 생길 때 그대로 결과가 반영하는 상황이 생겨 가능한 수동 커밋을 사용하는 것을 추천한다.

여기서 문제점을 파악하고 롤백을 사용하면 실수하기 전 상태로 되돌려 준다.

정리

  • 원자성 : 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공 하거나 모두 실패해야 한다.
    트랜잭션의 원자성 덕분에 여러 SQL 명령어를 마치 하나의 작업인 것 처럼 처리할 수 있었다. 성공하면 한번에 반영하고, 중간에 실패해도 마치 하나의 작업을 되돌리는 것 처럼 간단히 되돌릴 수 있다.
  • 오토 커밋 : 만약 오토 커밋 모드로 동작하는데, 계좌이체 중간에 실패하면 어떻게 될까?
    쿼리를 하나 실행할 때 마다 바로바로 커밋이 되어버리기 때문에 memberA 의 돈만 2000원 줄어드는 심각한 문제가 발생한다.
  • 트랜잭션 시작 : 따라서 이런 종류의 작업은 꼭 수동 커밋 모드를 사용해서 수동으로 커밋, 롤백 할 수 있도록 해야 한다. 보통 이렇게 자동 커밋 모드에서 수동 커밋 모드로 전환 하는 것을 트랜잭션을 시작한다고 표현한다.

DB 락 - 개념 이해

간단하게 알아보고 넘어가자.

세션1 과 세션2 가 memberA의 금액을 변경하고 싶어한다. 동시에 여러 사람이 같은 구조를 수정할 경우 문제점이 발생할 수 있어 데이터베이스는 락이라는걸 지원해준다.

락이란게 활성화 되어 있다면 먼저 수정하고자 접근한 사람이 모든 권한을 다 들고가 그 사람이 락을 반납하기 전 까지는 데이터 수정 할 수 없다.

다음과 같이 반납이 됐을 경우만 다른 사용자가 접근 가능하다.


DB 락 - 변경

이제 락이 어떻게 진행되는지 실습을 통해 배워보자.

사진과 같이 기본 테이블을 만들어보자.

테이블이 등록된 것을 확인 할 수 있다.

이제 세션1이 락을 가져오는 작업을 만들려고 한다.

수동 커밋을 변경했기에 커밋하기 전 까지는 세션1이 락을 들고 있다.

이 상태에서 세션2가 접근해서 데이터를 수정하려고 한다.

세션2는 10000원이 1000으로 수정하고자 입력했지만 세션1이 락을 들고 있어 변경 못하고 있는 모습을 확인 할 수 있다.

마침 세션1이 수정이 끝났는지 커밋을 입력해 결과를 반영했다.

사진과 같이 진행된거를 확인 할 수 있다. 그럼 이제 세션2는 락이 풀리자마자 수정하고자 락을 들고간다.

수정 테스트가 끝난 세션2는 다시 결과를 반영하기 위해 커밋을 입력해 락을 반납한다.

락이 기본 매커니즘은 이렇게 돌아가는걸 확인 할 수 있다.


DB 락 - 조회

조회할 때도 락을 걸어 중간에 남들이 데이터를 수정하는걸 막을 수 있다.

이번에도 기본 조회할 수 있는 테이블을 등록하고.

조회를 하기 위에 다음과 같이 코드를 입력해 락을 가져올 수 있다.

중간에 다른 사용자가 세션1이 조회하고 있을 때 세션2가 등장해 다음과 같이 10000원을 500원으로 수정하려고 했지만, 세션1이 락을 가지고 있어 권한 부재로 수정할 수 없게 되었다.

조회 중에 락을 푸는 방법도 동일하다. 수동 커밋이기에 커밋을 입력해주면 락을 반환한다.

락이 반환된 것을 확인 세션2는 다시 실행해보면

정상적으로 수정된 것을 확인 할 수 있다. 락과 관련된 조회 방식을 알아봤다.

profile
안녕하세요

0개의 댓글