..

RDBMS Auto Commit 동작원리: SQL은 언제 커밋되는가

TOC


  1. Overview
  2. Auto Commit이란
  3. Auto Commit ON과 OFF
  4. 명시적 트랜잭션과의 차이
  5. Conclusion
  6. Reference

Overview


앞 글인 RDBMS 트랜잭션은 왜 필요한가: 논리적 작업 단위와 커밋·롤백에서는 여러 SQL을 하나의 작업 단위로 묶는 트랜잭션을 살펴봤다.

이번 글에서는 트랜잭션을 직접 명시하지 않았을 때 데이터베이스가 어떻게 동작하는지 정리한다.

Auto Commit이란


Auto Commit은 SQL 실행 후 데이터베이스가 트랜잭션을 자동으로 끝내는 설정이다.

Auto Commit이 켜져 있고 BEGIN을 작성하지 않으면 SQL 하나가 하나의 암시적 트랜잭션이 된다.

SQL 실행
→ 트랜잭션 자동 시작
→ 성공하면 자동 COMMIT
→ 실패하면 해당 SQL ROLLBACK

즉, Auto Commit은 트랜잭션을 사용하지 않는 방식이 아니다. SQL마다 트랜잭션을 만들고 바로 끝내는 방식이다.

Auto Commit ON과 OFF


MariaDB에서는 Auto Commit이 기본적으로 켜져 있다.

SELECT @@autocommit;

Auto Commit ON

UPDATE account SET balance = balance - 10000
WHERE account_id = 1;

위 SQL이 성공하면 즉시 커밋된다. 다음 SQL이 실패해도 이미 커밋된 변경은 되돌아가지 않는다.

Auto Commit OFF

SET autocommit = 0;

UPDATE account SET balance = balance - 10000
WHERE account_id = 1;

UPDATE account SET balance = balance + 10000
WHERE account_id = 2;

COMMIT;

Auto Commit이 꺼지면 여러 SQL이 하나의 트랜잭션에 누적된다. 작업을 확정하려면 COMMIT, 취소하려면 ROLLBACK을 실행해야 한다.

명시적 트랜잭션과의 차이


Auto Commit이 켜져 있어도 START TRANSACTION을 사용하면 여러 SQL을 명시적으로 묶을 수 있다.

START TRANSACTION;

UPDATE account SET balance = balance - 10000
WHERE account_id = 1;

UPDATE account SET balance = balance + 10000
WHERE account_id = 2;

COMMIT;

차이는 트랜잭션의 경계를 누가 정하느냐에 있다.

방식 트랜잭션 범위 종료 방식
Auto Commit ON SQL 한 문장 데이터베이스가 자동 처리
Auto Commit OFF 여러 SQL COMMIT 또는 ROLLBACK 필요
명시적 트랜잭션 BEGIN부터 종료 시점까지 애플리케이션이 결정

Conclusion


다음 세 문장으로 정리할 수 있다.

  1. Auto Commit ON에서는 SQL마다 암시적 트랜잭션이 생성되고 자동 커밋된다.
  2. Auto Commit OFF에서는 여러 SQL이 누적되며 COMMIT 또는 ROLLBACK으로 종료한다.

Auto Commit은 트랜잭션이 없는 상태가 아니라, SQL마다 트랜잭션을 자동으로 완료하는 설정이다.

Reference