본문 바로가기

공부 기록/Database

Database Transaction & ACID

Transaction

  • 단일한 논리적인 작업 단위(a single logical unit of work)
  • 논리적인 이유로 여러 SQL문들을 단일 작업으로 묶어서 나눠질 수 없게 만든 것
  • transaction의 SQL문들 중에 일부만 성공해서 DB에 반영되는 일은 일어나지 않는다.

 

  • J가 H에게 20만원을 송금하는 트랜잭션
> SELECT * FROM acount;

> START TRANSACTION;
> UPDATE account SET balance = balance-200000 WHERE id='J';
> UPDATE account SET balance = balance+200000 WHERE id='H';

> COMMIT;

COMMIT

  • 지금까지 작업한 내용을 DB에 영구적으로 저장 + 트랜잭션을 종료한다.

ROLLBACK

> ROLLBACK;
  • 지금까지의 작업들을 모두 취소하고 트랜잭션 이전 상태로 되돌린다 + 트랜잭션을 종료한다.

AUTOCOMMIT

> SELECT @@AUTOCOMMIT;  # 1 = true (활성화 되어 있음)
  • 각각의 SQL문을 자동으로 트랜잭션 처리 해주는 개념
  • SQL문이 성공적으로 실행되면 자동으로 commit한다.
  • 실행 중에 문제가 있었다면 자동으로 rollback한다.
  • MySQL에서는 default로 autocommit이 enabled 되어 있다.
> SET autocommit=0;  # autocommit 비활성화
  • 오토커밋 off 상태에서 rollback을 수행하면 이전 상태로 되돌아갈 수 있다.

참고

  • START TRANSACTION 실행과 동시에 오토커밋은 off 된다.
  • COMMIT / ROLLBACK과 함께 트랜잭션이 종료되면 원래의 오토커밋 상태로 돌아간다.

- 자바 코드

public void transfer(String fromId, String toId, int amount) {
ㅤㅤtry {
ㅤㅤㅤㅤConnection connection = ...; // get DB connection
ㅤㅤㅤㅤconnection.setAutoCommit(false); // means START TRANSACTION
ㅤㅤㅤㅤ... // update at fromId
ㅤㅤㅤㅤ... // update at toId
ㅤㅤㅤㅤconnection.commit();
ㅤㅤ} catch (Exception e) {
ㅤㅤㅤㅤ...
ㅤㅤㅤㅤconnection.rollback();
ㅤㅤㅤㅤ...
ㅤㅤ} finally {
ㅤㅤㅤㅤconnection.setAutoCommit(true);
ㅤㅤ}
}

 

⬇️

 

@Transactional
public void transfer(String fromId, String toId, int amount){
ㅤㅤ... // update at fromId
ㅤㅤ... // update at toId
}

ACID

Atomicity

  • All or Nothing
  • transantion은 논리적으로 쪼개질 수 없는 작업 단위이기 때문에 내부의 SQL문들이 모두 성공해야 한다.
  • 중간에 SQL문이 실패하면 지금까지의 작업을 모두 취소하여 아무 일도 없었던 것처럼 rollback한다.

Consistency

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

Isolation

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

Durability

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

'공부 기록 > Database' 카테고리의 다른 글

Trigger  (0) 2023.11.23
Stored Procedure  (0) 2023.11.12
Three-tier architecture  (0) 2023.07.30
Stored Function  (0) 2023.07.26
Spring Data MongoDB 적용해보기  (0) 2023.06.28