Database

[DATABASE] Transaction (트랜잭션)

ju_young 2023. 12. 2. 16:02
728x90

Transaction?

A에서 B로 5000원 계좌이체를 한다고할때 다음 2가지 작업이 필요할 것이다.

  1. A의 잔고 5000원 감소
  2. B의 잔고 5000원 증가

만약 1번 작업은 성공했고 2번에서 문제가 발생하여 실패한다면 A만 5000원이 감소하게될 것이다. 이를 해결하기위해 트랜잭션은 1, 2 모두 성공해야 작업을 완료하고 둘 중에 하나라도 실패하면 거래 전의 상태로 되돌려준다.

이때 모든 작업이 성공해서 데이터베이스에 정상 반영하는 것을 commit, 하나라도 실패해서 작업 이전으로 되돌리는 것을 rollback 이라 한다.

Commit

START TRANSACTION;
UPDATE account SET balance = balance - 5000 WHERE id = 'A';
UPDATE account SET balance = balance + 5000 WHERE id = 'B';
COMMIT;
  • transaction 시작 이후 작업한 내용을 DB에 영구적으로 저장한다.

ROLLBACK

START TRANSACTION;
UPDATE account SET balance = balance - 5000 WHERE id = 'A';
ROLLBACK;
  • 작업을 모두 취소하고 transaction 이전 상태로 되돌린다.

AUTOCOMMIT

# AUTOCOMMIT 활성화 여부 확인
SELECT @@AUTOCOMMIT;
  • 각각의 SQL문을 자동으로 transaction 처리해준다.
  • SQL 문이 성공적으로 실행되면 자동으로 commit 한다.
  • 실행 중에 문제가 발생한다면 알아서 rollback을 수행한다.

NOTE
MySQL에서는 기본적으로 autocommit이 활성화되어 있다. 또한 START TRANSACTION을 실행하게 될 경우 autocommit은 비활성화된다. 반대로 commit/rollback을 수행하면 transaction이 종료되면 autocommit이 다시 원래 상태로 되돌아간다.

ACID

  • 원자성(Atomicity): 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공하거나 모두 실패애햐 한다.
  • 일관성(Consistency): 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다. 예를 들어 데이터베이스에서 정한 무결성 제약 조건을 항상 만족해야한다.
  • 격리성(Isolation): 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리한다. 예를 들어 동시에 같은 데이터를 수정하지 못하도록 해야한다.
  • 지속성(Durability): 트랜잭션을 성공적으로 끝내면 그 결과가 항상 기록되어야 한다. 중간에 문제가 발생해도 로그 등을 사용해서 성공한 내용을 복구해야한다.
728x90

'Database' 카테고리의 다른 글

[DATABASE] Isolation Level  (1) 2023.12.05
[DATABASE] Concurrency Control (Schedule, Serializability, Recoverability)  (1) 2023.12.04
[DATABASE] Trigger  (0) 2023.12.01
[DATABASE] Stored Procedure  (1) 2023.11.29
[DATABASE] Stored Function  (0) 2023.11.27