Spring DB : 자동 / 수동 Commit

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

    트랜잭션의 이해

    앞서 이야기했던 트랜잭션 내용을 DB에서 SQL문을 실제로 작성하며 이해를 해보고자 한다. 이 게시글에서는 하나의 테이블과 두 개의 세션을 이용해, 실제로 어떤게 동작하는지를 살펴본다. 

     

    테이블 생성 

    DROP TABLE MEMBER IF EXISTS;
    CREATE TABLE MEMBER(
    	MEMBER_ID VARCHAR(10),
    	MONEY INTEGER NOT NULL DEFAULT 0,
    	PRIMARY KEY(MEMBER_ID)
    
    )

    다음 SQL 문을 작성해서 두 개의 Column(Member_id, Money)를 가지는 Member 테이블을 만들 수 있다. 

     

    초기 데이터 셋팅

    INSERT INTO MEMBER(MEMBER_ID, MONEY) VALUES ('OLD', 10000)

    다음 SQL문을 사용해서 초기 데이터를 셋팅한다.

    SELECT * FROM MEMBER

    데이터가 정상적으로 셋팅되었는지를 다음 쿼리문으로 확인해본다.

    데이터가 정상적으로 셋팅된 것을 확인할 수 있다. 

     

     

    SQL 자동 커밋 / 수동 커밋 

    기본은 자동커밋

    SQL이 제공하는 세션은 기본적으로 자동 커밋 모드를 지원한다. 무슨 말이냐면, 쿼리를 날리는 즉시 커밋이 자동으로 된다는 것이다. 

    INSERT INTO MEMBER (MEMBER_ID, MONEY) VALUES ('ABC', 2000)
    INSERT INTO MEMBER (MEMBER_ID, MONEY) VALUES ('BCD', 3000)

    다음 쿼리를 날리고 DB에서 데이터가 들어갔는지 확인해본다. 그러면 바로 ABC, BCD라는 값이 확인된다. 이 말은, 쿼리를 날리는 순간 커밋이 실행되어 바로 데이터가 DB에 저장되었다는 이야기다. 이렇게 되면 앞서 이야기 했던 트랜잭션은 무용지물이 된다. 왜냐하면 쿼리 하나를 실행할 때 마다 커밋되기 때문에 하나처럼 이루어져야 할 일이 두 번에 나눠져서 실행이 되었다. 

     

    트랜잭션은 수동커밋

     

    // 수동 커밋 활성화
    set autocommit false;

    위와 같은 이유 때문에 트랜잭션 기능을 사용하려면 수동 커밋 모드를 활성화해야한다. 자동 커밋 기능을 끄면 되는데, 끄는 방법은 위의 SQL문을 입력하면 된다. 한번 세션에 수동 커밋 모드를 설정해주면 이 세션이 끝나거나, 자동 모드로 다시 설정할 때 까지 수동 커밋모드가 유지된다. 수동 커밋 모드는 당연하지만 내가 직접 커밋 / 롤백을 실행해야한다. 

     

    트랜잭션 시작 = 수동커밋 설정

    세션1 업데이트 쿼리 + 커밋 전

    수동 커밋모드를 설정하는 순간부터 트랜잭션을 시작한다고 이해할 수 있다. 자동 커밋은 쿼리를 실행하는 즉시 커밋이 되었다. 그렇지만 수동 커밋은 쿼리를 날려도, 쿼리에 의해 DB가 '임시 상태'로 저장되는 형태다. 즉, 앞서 확인했던 세션1의 상태와 동일하다고 볼 수 있다. 세션1만 데이터를 임시적으로 확인할 수 있는 상황이고, 다른 세션은 DB에서 해당 값을 조회할 수 없는 상황이다. 그리고 커밋을 하는 순간 DB에 데이터가 반영되고 다른 세션에서도 이를 확인할 수 있다. 이런 이유 때문에 '수동 커밋 모드를 설정하는 순간은 트랜잭션을 연다'라고 표현한다.

     

    트랜잭션 이용

     

    set autocommit false; // 트랜잭션 시작
    insert into member (member_id, money) values ('data1', 10000);
    insert into member (member_id, money) values ('data2', 20000);
    commit; // 커밋

    다음과 같이 수동 커밋모드를 설정해서 트랜잭션을 설정하고, 데이터를 삽입하고 커밋하는 과정이 트랜잭션을 이용하는 과정으로 이해를 할 수 있다. 

    다음과 같이 데이터가 정상적으로 들어가는 것을 확인할 수 있다. 

     

    정리

    1. 수동 커밋모드를 설정하는 것이 트랜잭션을 시작한다로 표현할 수 있다. 자동 커밋은 쿼리 한 줄마다 커밋이 실행되어버린다. 즉, 한 줄 자체가 트랜잭션으로 처리가 되는 것인데 진정한 의미의 트랜잭션이 아니다.
    2. 수동 커밋 모드를 설정할 경우 내가 원하는 범위만큼 쿼리를 실행한 후 커밋을 실행해야 비로소 DB에 데이터가 반영된다. 따라서 진정한 의미의 트랜잭션의 시작은 수동커밋 모드 설정으로부터 시작된다. 
    3. DB 커넥션과 트랜잭션 시작을 연결지어 보면 DB 커넥션을 얻고 + 수동 커밋 모드를 설정하는 것이 '트랜잭션을 시작한다'로 이해할 수 있다. 

    댓글

    Designed by JB FACTORY