본 프로젝트 자료는 김영한님의 스프링 DB 1편 - 데이터 접근 핵심 원리을 참고 제작됐음을 알립니다.
트랜잭션은 직역하면 거래라는 뜻이다. 데이터베이스라는 개념에 거래가 왜 필요할까?
그 이유는 단순 데이터를 저장하기만 하면 간혹 오류가 발생할 수 있다. 예를 들어 A 가 B 에게 5000원을 입금하는 상황일 때, A 는 5000 감소, B 는 5000 증가를 해야하지만 오류가 발생해 A 의 5000이 감소하고 B 의 5000이 증가하지 못한다면 그 프로그램을 운영하는 업체 입장에서는 큰일이 발생하게 된다.
이를 해결하기 위해 나온게 트랜잭션인데,
트랜잭션은 위와 같은 상황에서 각각 따로 행동하는게 아니라 두 개의 행동을 하나의 행동으로 처리된다. 만약 1을 성공했는데 2을 성공하지 못한다면 그 행동은 실패로 처리되어 반환한다. 결과적으로는 사용하는 입장에서 오류 화면만 제공하고 결과값이 바뀌는게 없다는 소리다.
이처럼 모든 작업이 성공해서 결과값을 반영한다면 커밋( Commit )이라 하고, 작업 중에 문제가 생겨 실패로 처리해 거래 이전으로 돌리는 것을 롤백( Rollback )이라 한다.
트랜잭션은 ACID 라는게 있다.
여기서 애매한 부분이 하나 있는데,
트랜잭션 간의 격리성을 보장하려면 트랜잭션을 거의 순서대로 실행해야 한다.
이렇게 되면 동시 처리 성능이 매우 나빠져, 이 문제를 해결하기 위해 위에 격리 수준을 4단계로 나눴다.
데이터베이스 서버 연결 구조와 DB 세션에 대해 알아보자.
데이터를 넣으면 어떻게 될까?
세션1 이 데이터를 커밋하지 않아 데이터들은 임시 데이터로 따로 보관하게 된다. 이 보관된 자료는 세션2 가 조회를 한다고 해서 조회가 가능한 데이터가 아니다. 커밋을 해야만 보인다.
커밋하지 않으면 임시 보관된 데이터들이 다른 사용자에게 조회가 됐을 때 어느 문제점이 생길까?
반면 커밋을 할 경우 데이터 보관이 임시에서 확정이 되는 것이기에 다른 세션에서 조회할 때 해당 데이터를 조회할 수 있다.
세션1 신규 데이터 추가 후 rollback
세션1 이 커밋 대신 롤백을 사용하면 본인이 등록한 모든 데이터가 처음 상태로 복구된다.
자동 커밋, 수동 커밋에 대해 알아보자.
예제 테이블 생성
트랜잭션을 사용하려면 먼저 자동 커밋과 수동 커밋을 이해해야 한다.
우선 자동 커밋은 커밋이나 롤백을 직접 호출하지 않아도 되는 편리함이 있다. 하지만 쿼리를 실행할 때 마다 전부 자동으로 호출해주기에 우리가 원하는 트랜잭션 기능을 제대로 사용할 수 없다.
자동 커밋 설정
쿼리가 입력만으로도 테이블에 반영한걸 확인 할 수 있다.
수동 커밋 설정
수동같은 경우 다음과 같이 commit; 이나 rollback; 을 직접 입력해야지만 쿼리가 반영된다. 만약 쿼리를 반영할 때 이 둘을 생략했다면 오류가 발생해 데이터가 반영하지 않는다.
지금까지 배운 내용들을 예습을 통해 확인해보자.
2개의 경우를 확인하기 위해 2개의 H2 데이터베이스를 켜두자.
기본 데이터
이제 데이터를 추가하는데 자동 커밋을 풀고 커밋을 하지 않은 상태를 확인해보자.
데이터 추가 - 커밋 전
자동 커밋을 false 로 바꾸고 commit 을 입력하지 않았다.
이러면 세션1 에만 보이는 임시저장 상태다.
세션2 에서 보이지 않는 것을 확인 할 수 있다.
반대로 커밋을 입력해주면 어떻게 될까?
commit 입력
커밋을 입력.
세션1 에서만 임시데이터가 정식으로 등록되어 확인할 수 있는 모습이다.
이번에는 롤백에 대해 알아보자.
rollback 입력
롤백을 테스트하기 위해 기존 데이터를 전부 초기화 시켜준다.
세션1,2 전부 해당된다.
데이터 초기화.
세션1,2 멤버 테이블을 다시 생성해서 등록.
아까처럼 세션1에 쿼리 등록.
임시 등록이라 안보인다.
이제 롤백을 사용해볼려고 한다.
세션1,2 가 롤백으로 데이터가 DB에 반영되지 않은 것을 확인할 수 있다.