Spring DB : 자동 / 수동 Commit
- Spring/Spring DB
- 2022. 4. 28.
이 글은 인프런 김영한님의 강의를 복습하며 작성한 글입니다.
트랜잭션의 이해
앞서 이야기했던 트랜잭션 내용을 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문을 입력하면 된다. 한번 세션에 수동 커밋 모드를 설정해주면 이 세션이 끝나거나, 자동 모드로 다시 설정할 때 까지 수동 커밋모드가 유지된다. 수동 커밋 모드는 당연하지만 내가 직접 커밋 / 롤백을 실행해야한다.
트랜잭션 시작 = 수동커밋 설정
수동 커밋모드를 설정하는 순간부터 트랜잭션을 시작한다고 이해할 수 있다. 자동 커밋은 쿼리를 실행하는 즉시 커밋이 되었다. 그렇지만 수동 커밋은 쿼리를 날려도, 쿼리에 의해 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; // 커밋
다음과 같이 수동 커밋모드를 설정해서 트랜잭션을 설정하고, 데이터를 삽입하고 커밋하는 과정이 트랜잭션을 이용하는 과정으로 이해를 할 수 있다.
다음과 같이 데이터가 정상적으로 들어가는 것을 확인할 수 있다.
정리
- 수동 커밋모드를 설정하는 것이 트랜잭션을 시작한다로 표현할 수 있다. 자동 커밋은 쿼리 한 줄마다 커밋이 실행되어버린다. 즉, 한 줄 자체가 트랜잭션으로 처리가 되는 것인데 진정한 의미의 트랜잭션이 아니다.
- 수동 커밋 모드를 설정할 경우 내가 원하는 범위만큼 쿼리를 실행한 후 커밋을 실행해야 비로소 DB에 데이터가 반영된다. 따라서 진정한 의미의 트랜잭션의 시작은 수동커밋 모드 설정으로부터 시작된다.
- DB 커넥션과 트랜잭션 시작을 연결지어 보면 DB 커넥션을 얻고 + 수동 커밋 모드를 설정하는 것이 '트랜잭션을 시작한다'로 이해할 수 있다.
'Spring > Spring DB' 카테고리의 다른 글
Spring DB : DB 예제4 - 트랜잭션과 계좌이체 (0) | 2022.04.28 |
---|---|
Spring DB : DB 예제3 - 트랜잭션 실습 (0) | 2022.04.28 |
Spring DB : DB 트랜잭션의 이해 (1) (0) | 2022.04.28 |
Spring DB : 데이터베이스 연결 구조와 DB 세션 (0) | 2022.04.28 |
Spring DB : 트랜잭션 개념 (0) | 2022.04.28 |