Post

Database 11. Transaction과 ACID

데이터 베이스 이론 공부

Database 11. Transaction과 ACID
  • MySQL 문법을 기준으로 서술한다.

Transaction 이란?

  • 단일한 논리적인 작업 단위(a single logical unit of work)
  • 논리적인 이유로 여러 SQL문들을 단일 작업으로 묶어서 나눠질 수 없게 만든 것
  • transaction의 SQL 문들 중에 일부만 성공해서 DB에 반영되는 일은 일어나지 않는다.
1
2
3
4
START TRANSACTION;
UPDATE account SET balance = balance - 200000 WHERE id = 'j';
UPDATE account SET balance = balance + 200000 WHERE id = 'h';
COMMIT; -- 지금까지 작업한 내용을 DB에 영구적으로(permanently) 저장.(transaction을 종료)
1
2
3
4
START TRANSACTION;
UPDATE account SET balance = balance - 200000 WHERE id = 'j';

ROLLBACK; -- 지금까지 작업들을 모두 취소하고 transaction 이전 상태로 되돌린다.(transaction을 종료)

AUTOCOMMIT

  • 각각의 SQL문을 자동으로 transaction 처리 해주는 개념
  • SQL문이 성공적으로 실행하면 자동으로 commit한다.
  • 실행 중에 문제가 있었다면 알아서 rollback한다.
  • MySQL에서는 default로 autocommit이 enabled 되어 있다.
  • 다른 RDBMS에서도 대부분 같은 기능을 제공한다.
1
SELECT @@AUTOCOMMIT; -- 활성 여부 확인
1
SET autocommit=0; -- 비활성화
  • START TRANSACTION 실행과 동시에 autocommit은 off된다.
  • COMMIT/ROLLBACK과 함께 transaction이 종료되면 원래 autocommit 상태로 돌아간다.

ACID

Atomicity(원자성)

  • ALL or NOTHING
  • transaction은 논리적으로 쪼개질 수 없는 작업 단위이기 때문에 내부의 SQL문들이 모두 성공해야 한다.
  • 중간에 SQL문에 실패하면 지금까지의 작업을 모두 취소하여 아무 일도 없었던 것처럼 rollback 한다.
  • commit 실행 시 DB에 영구적으로 저장하는 것은 DBMS가 담당하는 부분이다.
  • rollback 실행 시 이전 상태로 되돌리는 것도 DBMS가 담당하는 부분이다.
  • 개발자는 언제 commit 하거나 rollback 해야할지를 챙겨야 한다.

Consistency(일관성)

  • transaction은 DB 상태를 consistent 상태에서 또 다른 consistent 상태로 바꿔줘야 한다.
  • constraints, trigger 등을 통해 DB에 정의된 rules을 transaction이 위반했다면 rollback해야 한다.
  • transaction이 DB에 정의된 rule을 위반했는지는 DBMS가 commit 전에 확인하고 알려준다.
  • 그 외에 application이 consistent하게 동작하는지에 개발자가 챙겨야 한다.

Isolation(고립성)

  • 여러 transaction들이 동시에 실행될 때도 혼자 실행되는 것처럼 동작하게 만든다.
  • DBMS는 여러 종류의 isolation level을 제공한다.
  • 개발자는 isolation level 중에 어떤 level로 transaction을 동작시킬지 설정할 수 있다
  • concurrency control의 주된 목표가 isolation이다.

Durability(영존성)

  • commit된 transaction은 DB에 영구적으로 저장한다.
  • 즉, DB system에 문제(power fail or DB crash)가 생겨도 commit된 transaction은 DB에 남아 있는다.
  • ‘영구적으로 저장한다’라고 할 때는 일반적으로 ‘비휘발성 메모리(HDD, SDD 등등)에 저장함’을 의미한다.
  • 기본적으로 transaction의 durability는 DBMS가 보장한다.

개발자로써

  1. transaction을 어떻게 정의해서 쓸지는 개발자가 정하는 것이다. 구현하려는 기능과 ACID 속성을 이해해야 transaction을 잘 정의할 수 있다.
  2. transaction의 ACID와 관련해서 개발자가 챙겨야하는 부분이 존재한다. DBMS가 모든 것을 알아서 해주는 것이 아니다.
This post is licensed under CC BY 4.0 by the author.