Spring DB : DB 예제3 - 트랜잭션 실습

    이 글은 인프런 김영한님의 강의를 복습하며 작성한 글입니다. 

    트랜잭션 커밋 / 롤백 실습

    이번 포스팅에서는 H2 DB를 이용해 트랜잭션의 커밋 / 롤백을 확인하려고 한다.

    1. 트랜잭션 격리성을 확인하기 위해 두 개의 세션을 만든다. 
      • 브라우저 2개를 켜서, 각각 DB에 로그인하면 된다. 이렇게 하면 DB 세션이 두 개 생성됨.
    2. 기본 올드 데이터를 만들어준다. 그리고 잘 들어갔는지 각 세션에서 SELECT 쿼리를 통해 확인한다. 

     

    DB 세션 여러 개 생성의 의미

    // 세션1
    http://192.168.0.15:8082/login.do?jsessionid=29f1fe9c6178ae0905e3f40bf54f2375
    
    // 세션2
    http://192.168.0.15:8082/login.do?jsessionid=29f1fe9c6178ae0905e3f40bf54f2375

    H2 DB를 웹으로 접근해서 로그인 하면 다음과 같은 URL이 표시된다. URL의 끝에는 쿼리 파라미터로 'jssessionId'가 붙어있는데, 각 브라우저의 jssessionId가 다르다. JSSESIONID는 세션이 만들어졌을 때, 응답해주는 세션 쿠키다. 그런데 세션 쿠키가 다르다는 것이니 DB 세션이 2개가 생겼다고 이해할 수 있음.

     

    실습 확인

    세션1에서 트랜잭션 모드를 설정하고, 신규회원 1,2 데이터를 넣는다. 이 때, 세 가지를 확인해볼 것이다.

    1. 세션1에서 신규회원 1,2 데이터를 쿼리만 보내고, 세션 1 + 2에서 데이터를 조회하는 상황 + 커밋 후 조회
    2. 세션1에서 신규회원 1,2 데이터 쿼리 + 롤백 후, 세션 1 + 2에서 데이터를 조회하는 상황

     

    세션 1에서 신규회원 1,2 데이터를 쿼리만 보내고, 세션 1+2에서 데이터를 조회하는 상황 + 커밋 후 조회

    왼쪽이 세션1, 오른쪽이 세션2다. 현재 DB의 상태를 SELECT 문으로 확인했을 때, 둘다 data1이라는 값이 존재하는 것을 확인할 수 있다. 

    // 트랜잭션 시작
    set autocommit false;
    insert into member (member_id, money) values('new1', 10000)

    세션1에서 다음 SQL 문을 실행한다. 

    세션1은 아직 Commit 전인 상황이다. 따라서 세션1이 INSERT한 데이터는 DB에 임시상태로 저장된 상황이기 때문에 세션1만 조회가 가능하다. 세션2는 아직 커밋 전인 데이터를 조회하지 못하기 때문에 세션1의 데이터를 볼 수 없다.

    commit;

    이제 세션1에서 commit 명령어를 통해 커밋해준다.

    커밋 후, 양쪽 세션에서 모두 "new1"이 조회되는 것을 확인할 수 있다. 

     

    세션1에서 신규회원 1,2 데이터 쿼리 + 롤백 후, 세션 1 + 2에서 데이터를 조회하는 상황

    먼저 기본 데이터를 셋팅한다.

    // 트랜잭션 시작
    set autocommit false;
    insert into member(member_id, money) values ('new1', 10000);

    세션1에서 다음 SQL문을 실행해서 값을 DB에 넣는다.

    SELECT 문을 이용해서 현재 DB에 들어가있는 값을 모두 확인해본다. 현재 세션1은 본인이 밀어넣은 'NEW1'이라는 값까지 보이지만 아직 커밋 전이다. 따라서 세션2에서는 NEW1은 보이지 않고 'DATA1'만 보이는 상황이다.

    // 세션1 : 롤백
    rollback;

    이 때, 세션1이 롤백을 한다.

    세션1이 롤백 후 SELECT 문으로 조회를 해본다. 세션1이 롤백을 했기 때문에 기존에 세션1에 의해서 DB에 저장되어 '임시' 상태로 있던 데이터는 사라졌다. 따라서 세션1 / 세션2 모두 같은 값을 바라보게 된다. 

     

    댓글

    Designed by JB FACTORY