[데이터베이스] 트랜잭션과 ACID

Yoon Uk·2023년 3월 18일
0

데이터베이스

목록 보기
17/20
post-thumbnail
post-custom-banner

참고 - YouTube: 쉬운코드

1. 트랜잭션의 개념

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

2. 트랜잭션 이해에 필요한 개념

1) COMMIT

  • 지금까지 작업한 내용을 DB에 영구적으로(permanently) 저장하라는 명령어
  • transaction을 종료한다.

2) ROLLBACK

  • 지금까지 작업들을 모두 취소하고 transaction 이전 상태로 되돌린다.
  • transaction을 종료한다.

3) AUTOCOMMIT

  • 각각의 SQL문을 자동으로 transaction 처리 해주는 개념
  • SQL문이 성공적으로 실행하면 자동으로 COMMIT 한다.
  • 실행 중에 문제가 있었다면 알아서 ROLLBACK한다.
  • MySQL에서는 default로 AUTOCOMMIT이 enabled 되어 있다.
  • 다른 DBMS에서도 대부분 같은 기능을 제공한다.

3-1) AUTOCOMMIT이 활성화 된 상태

  • INSERT, DELETE 등 SQL을 사용해 명령을 하면 자동으로 COMMIT 되면서 데이터가 영구적으로 저장되거나 삭제된다.

3-2) AUTOCOMMIT이 비활성화 된 상태

  • COMMIT이 자동으로 되지 않기 때문에 ROLLBACK을 한다면 다시 이전 상태로 돌아갈 수 있다.

3. 트랜잭션 예시

A의 계좌에서 B의 계좌로 200,000원을 보내는 상황이다.

START TRANSACTION;
UPDATE account SET balance = balance - 200000 WHERE	id = 'A';
UPDATE account SET balance = balance + 200000 WHERE	id = 'B';
COMMIT;

A 계좌에서 200,000원을 빼고 B계좌는 200,000원을 더하는 작업을 하나의 transaction으로 처리한다.

  • START TRANSACTION 실행과 동시에 AUTOCOMMIT 은 off 된다.
    • 이러한 이유로 transaction 도중 ROLLBACK을 할 수 있다.
  • COMMIT / ROLLBACK과 함께 transaction이 종료되면 원래 AUTOCOMMIT 상태로 돌아간다.
    • transaction 시작 전에 활성화 된 상태라면 transaction 이후 활성화
    • transaction 시작 전에 비활성화 된 상태라면 transaction 이후 비활성화

4. 트랜잭션 사용 패턴

  1. transaction을 시작(begin)한다.
  2. 데이터를 읽거나 쓰는 등의 SQL문들을 포함해서 로직을 수행한다.
  3. 일련의 과정들이 문제없이 동작했다면 transaction을 COMMIT 한다.
  4. 중간에 문제가 발생했다면 transaction을 ROLLBACK 한다.

5. ACID

트랜잭션이 어떤 속성을 가져야 하는지 나타내는 개념

1) Atomicity

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

2) Consistency

  • DB의 데이터들은 항상 일관된 규칙을 지킬 수 있도록 유지되어야 한다.
    • 예) 계좌에 들어있는 돈은 항상 0 이상이어야 한다...
  • transaction은 DB 상태를 consistent 상태에서 또 다른 consistent 상태로 바꿔줘야 한다.
  • constraints, trigger 등을 통해 DB에 정의된 rules을 transaction이 위반했다면 rollback 해야 한다.
  • DBMS의 역할
    • transaction이 DB에 정의된 rule을 위반했는지 COMMIT 전에 확인하고 알려준다.
  • 개발자의 역할
    • 그 외에 application 관점에서 transaction이 consistent하게 동작하는지 챙겨야 한다.

3) Isolation

  • 여러 transaction들이 동시에 실행될 때도 혼자 실행되는 것처럼 동작하게 만든다.
  • DBMS는 여러 종류의 isolation level을 제공한다.
    • 너무 엄격하게 격리하면 DB의 퍼포먼스가 안좋아질 수 있기 때문
  • isolation level 중에 어떤 level로 transaction을 동작시킬지 설정할 수 있다.
    • SERIALIZABLE
    • REPEATABLE_READ
    • READ_COMMITED
    • READ_UNCOMMITED
  • concurency control의 주된 목표가 isolation이다.

4) Durability

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

6. 마무리

  1. transaction을 어떻게 정의해서 쓸지는 개발자가 정하는 것이다.
    • 구현하려는 기능과 ACID 속성을 이해해야 transaction을 잘 정의할 수 있다.
  2. transaction의 ACID와 관련해서 개발자가 챙겨야 하는 부분들이 있다.
    • DBMS가 모든 것을 알아서 해주는 것은 아니다.

참고

scaler

post-custom-banner

0개의 댓글