Transaction
- 단일한 논리적인 작업 단위
- 논리적인 이유로 여러 SQL문들을 단일 작업으로 묶어서 나눠질 수 없게 만든 것이 transaction 이다
- transaction 의 SQL문들 중에 일부만 성공해서 DB에 반영되는 일은 일어나지 않는다
예시1) J가 H에게 20만원 이체할때
START TRANSACTION;
UPDATE account SET balance = balance - 200000 WHERE id = 'J';
UPDATE account SET balance = balance + 200000 WHERE id = 'H';
COMMIT;
START TRANSACTION :transaction을 시작한다
COMMIT : 지금까지 작업한 내용을 DB에 영구적으로 저장하라, transaction을 종료한다
ROLLBACK : 지금까지 작업들을 모두 취소하고 transaction 이전 상태로 되돌린다, transaction을 종료한다
SELECT @@AUTOCOMMIT; -- 1:true 0:false
AUTOCOMMIT
- 각각의 SQL문을 자동으로 transaction처리 해주는 개념
- SQL문이 성공적으로 실행하면 자동으로 commit한다
- 실행중에 문제가 있었다면 알아서 rollback 한다
- MySQL에서는 default로 autocommit이 enabled 되어 있다
- 다른 DBMS에서도 대부분 같은 기능을 제공한다
- START TRANSACTION 실행과 동시에 autocommit은 off된다
- COMMIT / ROLLBACK 과 함께 transaction이 종료되면 원래 autocommit 상태로 돌아간다
일반적인 transaction 사용 패턴
- transaction을 시작한다
- 데이터를 읽거나 쓰는 등의 SQL문들을 포함해서 로직을 수행한다
- 일련의 과정들이 문제없이 동작했다면 commit
- 중간에 문제가 발생했다면 transaction을 rollback
Spring사용시 @Transactional 어노테이션을 붙이면 transaction과 관련된 코드들을 알아서 수행한다
ACID 트랜잭션
Atomicity (원자성)
- ALL or NOTHING
- transaction은 논리적으로 쪼개질 수 없는 작업 단위이기 때문에 내부의 SQL문들이 모두 성공해야 한다
- 중간에 SQL문이 실패하면 지금까지의 작업을 모두 취소하여 아무 일도 없었던 것처럼 rollback 한다
- commit 실행 시 DB에 영구적으로 저장하는 것, rollback 실행 시 이전 상태로 되돌리는 것은 DBMS가 담당하는 부분이다. 개발자는 언제 commit 하거나 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, SSD, …)에 저장함’을 의미한다
- 기본적으로 transaction의 durability는 DBMS가 보장한다
'STUDY > database' 카테고리의 다른 글
| transaction isolation level (0) | 2023.12.11 |
|---|---|
| concurrency control - schedule과 serializability (0) | 2023.12.03 |
| SQL trigger (1) | 2023.12.03 |
| stored procedure설명 / 장단점 (1) | 2023.12.03 |
| [MySQL] stored function (0) | 2023.11.27 |