본 프로젝트 자료는 김영한님의 스프링 DB 1편 - 데이터 접근 핵심 원리을 참고 제작됐음을 알립니다.
계좌이체라는 예제를 만들어 다음과 같은 3가지 상황을 알아볼려고 한다.
일단 기본 데이터가 입력된 테이블을 준비한다.
멤버A 와 멤버B 의 통장에 10000원을 세팅한다.
이제 계좌이체를 실행하는 상황을 만들어본다.
여기서 수동 커밋으로 만든 상태이기에 커밋만 입력하면 결과가 반영된다.
사용자 A, B 모두 정상적으로 이체가 완료되어 같은 화면인 것을 확인했다.
만약 개발자가 코드 입력 도중 오타가 발생하여 문제가 발생한 상태라면 어떻게 될까?
다시 기본 테이블 상태로 돌아가자.
여기서 A가 B에게 2000원 을 입금했는데 B의 코드에 오타가 발생했다.
member_id 가 member_iddd 로 잘못 입력되었다.
이런 상태에서 커밋을 입력하게 될 경우, 순차적으로 입력되는 시스템이기에 첫 번째는 성공으로 간주하고 데이터를 반영했지만, 두 번째는 실패로 데이터 반영에 실패했다.
A 사용자의 2000원 돈만 사라지게 된다.
오토커밋을 방금과 같이 사용하면 편리하나 이런 사소한 실수가 생길 때 그대로 결과가 반영하는 상황이 생겨 가능한 수동 커밋을 사용하는 것을 추천한다.
여기서 문제점을 파악하고 롤백을 사용하면 실수하기 전 상태로 되돌려 준다.
간단하게 알아보고 넘어가자.
세션1 과 세션2 가 memberA의 금액을 변경하고 싶어한다. 동시에 여러 사람이 같은 구조를 수정할 경우 문제점이 발생할 수 있어 데이터베이스는 락이라는걸 지원해준다.
락이란게 활성화 되어 있다면 먼저 수정하고자 접근한 사람이 모든 권한을 다 들고가 그 사람이 락을 반납하기 전 까지는 데이터 수정 할 수 없다.
다음과 같이 반납이 됐을 경우만 다른 사용자가 접근 가능하다.
이제 락이 어떻게 진행되는지 실습을 통해 배워보자.
사진과 같이 기본 테이블을 만들어보자.
테이블이 등록된 것을 확인 할 수 있다.
이제 세션1이 락을 가져오는 작업을 만들려고 한다.
수동 커밋을 변경했기에 커밋하기 전 까지는 세션1이 락을 들고 있다.
이 상태에서 세션2가 접근해서 데이터를 수정하려고 한다.
세션2는 10000원이 1000으로 수정하고자 입력했지만 세션1이 락을 들고 있어 변경 못하고 있는 모습을 확인 할 수 있다.
마침 세션1이 수정이 끝났는지 커밋을 입력해 결과를 반영했다.
사진과 같이 진행된거를 확인 할 수 있다. 그럼 이제 세션2는 락이 풀리자마자 수정하고자 락을 들고간다.
수정 테스트가 끝난 세션2는 다시 결과를 반영하기 위해 커밋을 입력해 락을 반납한다.
락이 기본 매커니즘은 이렇게 돌아가는걸 확인 할 수 있다.
조회할 때도 락을 걸어 중간에 남들이 데이터를 수정하는걸 막을 수 있다.
이번에도 기본 조회할 수 있는 테이블을 등록하고.
조회를 하기 위에 다음과 같이 코드를 입력해 락을 가져올 수 있다.
중간에 다른 사용자가 세션1이 조회하고 있을 때 세션2가 등장해 다음과 같이 10000원을 500원으로 수정하려고 했지만, 세션1이 락을 가지고 있어 권한 부재로 수정할 수 없게 되었다.
조회 중에 락을 푸는 방법도 동일하다. 수동 커밋이기에 커밋을 입력해주면 락을 반환한다.
락이 반환된 것을 확인 세션2는 다시 실행해보면
정상적으로 수정된 것을 확인 할 수 있다. 락과 관련된 조회 방식을 알아봤다.