본문 바로가기
영상 후기/데이터베이스

영상 후기 - 데이터베이스 트랜잭션(transaction)을 아십니까? 그리고 트랜잭션의 매우 중요한 속성들인 ACID를 아십니까? 모르신다면 들렀다 가시지요

by 올리브영 2023. 4. 2.
728x90
반응형

movie

Transaction

  • 단일한 논리적인 작업 단위
  • 논리적인 이유로 여러 SQL문들을 단일 작업으로 묶어서 나눠질 수 없게 만든 것이 transaction이다.
    • 계좌이체에서 송금하는 것과 송금한 것을 받는 두 작업이 모두 성공 되어야 함. 하나만 성공하면 안됨.
  • transaction의 SQL문들 중에 일부만 성공해서 DB에 반영되는 일은 일어나지 않는다.

 

트랜잭션을 통해 20만원 계좌이체 송금하는 예제

START TRANSACTION; // 트랜잭션을 시작한다.
UPDATE account SET balance = balance - 200000 WHERE id = 'J'; // J의 계좌에서 20만원을 뺌.
UPDATE account SET balance = balance + 200000 WHERE id = 'H'; // H의 계좌에 20만원을 넣어줌.
COMMIT; // 지금까지 작업한 내용을 DB에 영구적으로 저장하라 - 트랜잭션을 종료한다.

 

롤백을 통한 작업 취소 및 이전 상태로 되돌림.

START TRANSACTION;
UPDATE account SET balance = balance - 300000 WHERE id = 'J';
ROLLBACK; // 지금까지 작업들을 모두 취소하고 트랜잭션 이전 상태로 되돌림 - 트랜잭션 종료

 

AUTOCOMMIT

  • 각각의 SQL문을 자동으로 트랜잭션 처리 해주는 개념
  • SQL문이 성공적으로 실행하면 자동으로 commit 한다.
  • 실행 중에 문제가 있었다면 알아서 rollback 한다.
  • MySQL에서는 default로 autocommit이 활성화 되어있다.
  • 다른 DBMS에서도 대부분 같은 기능을 제공한다.

 

SELECT @@AUTOCOMMIT; // 현재 오토커밋이 활성화상태인지 아닌지 확인. 1이면 TRUE

SET autocommit=0; // 오토커밋을 비활성화 상태로 만듬.

DELETE FROM account WHERE balance <= 1000000;

ROLLBACK; // delete한것을 취소하고 되돌림.

 

  • START TRANSACTION 실행과 동시에 autocommit은 off된다.
  • COMMIT / ROLLBACK과 함께 transaction이 종료되면 원래 autocommit 상태로 돌아간다.

 

일반적인 트랜잭션 사용패턴

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

 

  • commit 실행 시 DB에 영구적으로 저장하는 것은 DBMS가 담당하는 부분
  • rollback 실행 시 이전 상태로 되돌리는 것도 DBMS가 담당하는 부분
  • 개발자는 언제 commit 하거나 rollback 할지를 챙겨야 한다.

 

 

스프링에서 @Transactional 어노테이션을 붙이면 트랜잭션 관련 코드를 안써도 된다.

 

 

트랜잭션의 ACID(트랜잭션이 어떤 속성을 지닌 개념)

  • Atomicity
  • Consistency
  • Isolation
  • Durability

 

Atomicity(원자성)

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

Consistency(일관성)

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

Isolation(격리, 분리)

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

Durability(영속성)

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

 

728x90
반응형