[DB] auto-commit 이란?

Sungjin Cho·2024년 5월 21일

DB

목록 보기
1/3
post-thumbnail

MySQL을 사용하면 SET AUTOCOMMIT = 1; 혹은 SET AUTOCOMMIT = 0;의 쿼리를 본 적이 있을 것이다.

이 auto-commit 이 도대체 뭘까?

auto-commit

RDS를 사용하면 트랜잭션을 사용하게 된다. 트랜잭션을 간단히 설명하면 일련의 작업 단위를 하나로 묶어서 처리할 수 있도록 해주는 것을 의미하는데, 이는 한번에 묶어서 처리되는 만큼 한꺼번에 모두 성공하거나, 모두 실패해야한다.

하나의 트랜잭션은 COMMIT이나 ROLLBACK을 만나면 끝이 난다.

1번 예시

만약 A 사용자가 계좌에서 10만원을 출금하여 B한테 송금하는 상황이 있다고 하면,
작업 A, 작업 B, 총 2개의 작업 단위로 나뉠 것이다.

순서대로 작업 되던 중 작업 A와 작업 B 사이에서 오류가 발생한다면?
이미 작업 A는 처리되어 commit된 시점이라, A의 돈 10만원은 차감되어 있는 상황이다.

문제가 발생되었기 때문에 rollback을 하게 되는데, 가장 가까운 commit 시점인 A가 끝난 시점으로 돌아가게 된다.
이러면 A 사용자는 돈 10만원을 그냥 날리게 된다.
따라서 이러한 문제를 해결하기 위해 "작업 단위"를 직접 지정하는 것이다.

auto-commit을 false로 해두었기 때문에 작업 A 를 진행하던 도중에 어디에서든 문제가 발생해도 맨 처음 "A계좌 조회" 전의 시작단계로 rollback하게 된다.
이전과 같은 상황이라면 A의 10만원 또한 복구될 것 이다.

이것이 JDBC의 기본적인 트랜잭션 방법이자, Spring의 @Transactional 의 핵심이다.

위에서 언급한대로 'Java에서 트랜잭션을 시작하는 유일한 방법'이기 때문에 Spring의 @Transactional 도 동일하게 동작한다.

  1. 만약 Spring이 어떠한 Bean에 붙어있는 @Transactional 을 발견한다면, 해당 bean의 동적 proxy를 만들게 된다.
  2. proxy는 transaction manager에 접근할 수 있으며, transactions이나 connections을 열고 닫도록 요청한다.
  3. transaction manager는 JDBC 방식으로 connection을 관리할 뿐이다.

2번 예시

비즈니스 로직의 요구사항 중 id가 1번인 유저의 이름을 민정으로, id가 2번인 유저의 이름을 조앤으로 바꿔야하며 이 두가지는 무조건 함께 실행되어야하고 하나만 성공해서는 안된다는 요구사항이 있다.

SET AUTOCOMMIT = 1;
update students set name = "민정" where id = 1; -- 이하 첫번째 쿼리
update students set name = "조앤" where id = 2; -- 이하 두번째 쿼리

위와 같이 쿼리를 수행하는 중, 만약 두번째 쿼리가 실패하게 된다면?

SET AUTOCOMMIT = 1로 설정되어있기 때문에 이미 첫번째 쿼리는 정상적으로 COMMIT 되어 데이터베이스에 반영되었고, 실패한 두번째쿼리만 데이터베이스에 반영되지 않았다.

헉! 둘다 성공하거나 실패해야하는데 AUTOCOMMIT 속성 때문에 수행한 쿼리 단건이 자동으로 커밋되어버려 두 쿼리를 트랜잭션으로 묶지 못했다..

만약 SET AUTOCOMMIT = 0;으로 설정되어있었다면?

SET AUTOCOMMIT = 0;
update students set name = "민정" where id = 1; -- 이하 첫번째 쿼리
update students set name = "조앤" where id = 2; -- 이하 두번째 쿼리
COMMIT;

두 쿼리가 끝나는 시점에 COMMIT을 수행하기 때문에 두번째 쿼리가 실패했다면 모두 ROLLBACK된다.

즉 AUTOCOMMIT이란 모든 단건의 쿼리마다 자동으로 COMMIT이 실행되어 데이터베이스에 영구적으로 반영되도록 하는 명령을 말한다.

참고: 1번 예시 - https://blogshine.tistory.com/291,
2번 예시 -https://velog.io/@seovalue/autocommit%EC%9D%B4-%EB%8F%84%EB%8C%80%EC%B2%B4-%EB%AD%94%EB%8D%B0

0개의 댓글