참고 자료
트랜잭션 개념
이체로 배워보는 트랜잭션 개념
A: 100만원
B: 200만원
A → B 에게 20만원 송금
그럼 2개의 SQL문을 사용한다.
1. A 계좌 20만원 감소 UPDATE account SET balance = balance - 200000 WHERE id = 'A';
2. B 계좌 20만원 증가 UPDATE account SET balance = balance + 200000 WHERE id = 'B';
이 2가지 SQL문 중에서 1개의 SQL만 실패해도 이상한 결과가 나온다.
EX)
1번 성공 2번 실패: A 계좌에서 20만원만 증발
1번 실패 2번 성공: B 계좌는 20만원 증가했지만 A 계좌는 그대로 유지
즉 이런 이체 작업은 둘 다 정상 처리돼야만 성공하는 단일 작업이다.
이런 단일 작업의 개념을 데이터베이스에서는 트랜잭션(Transaction)이라고 한다.
트랜잭션 정의
- 단일한 논리적인 작업 단위 (a single logical unit of work)
- 논리적인 이유로 여러 SQL문들을 단일 작업으로 묶어서 나눠질 수 없게 만든 것이 transaction 이다
- transaction의 SQL 문들 중에 일부만 성공해서 DB에 반영되는 일은 일어나지 않는다
MySQL 트랜잭션 예제
트랜잭션 개념에서 사용했던 예제를 MySQL로 구현
START TRANSACTION;
UPDATE account SET balance = balance - 200000 WHERE id = 'A';
UPDATE account SET balance = balance + 200000 WHERE id = 'B';
COMMIT;
COMMIT
- 지금까지 작업한 내용을 DB에 영구적으로 저장하라
- 트랜잭션을 종료한다
ROLLBACK
- 지금까지 작업들을 모두 취소하고 트랜잭션 이전 상태로 되돌린다
- 트랜잭션을 종료한다
AUTO COMMIT
각각의 SQL문을 자동으로 트랜잭션 처리 해주는 개념
SQL문이 성공적으로 실행하면 자동으로 commit 한다
실행 중에 문제가 있었다면 알아서 rollback 한다
MySQL에서는 default로 autocommit이 enabled 되어 있다
다른 DBMS에서도 대부분 같은 기능을 제공한다
현재 AUTO COMMIT 활성화 여부 확인
SELECT @@AUTOCOMMIT;
1 = TRUE
AUTO COMMIT 비활성화
SET autocommit=0;
START TRANSACTION
START TRANSACTION 실행과 동시에 autocommit은 off 된다
COMMIT / ROLLBACK과 함께 트랜잭션이 종료되면 원래 autocommit 상태로 돌아간다
일반적인 트랜잭션 사용 패턴
1. 트랜잭션을 시작
2. 데이터를 읽거나 쓰는 등의 SQL문을 포함해서 로직을 수행
3. 일련의 과정들이 문제없이 동작했다면 트랜잭션 commit
4. 중간에 문제가 발생했다면 트랜잭션 rollback
트랜잭션 속성 ACID
Atomicity (원자성)
ALL or NOTHING
트랜잭션은 논리적으로 쪼개질 수 없는 작업 단위이기 때문에 내부의 SQL문들이 모두 성공해야 한다
중간에 SQL 문이 실패하면 지금까지의 작업을 모두 취소하여 아무 일도 없었던 것처럼 rollback 한다
commit 실행 시 DB에 영구적으로 저장하는 것은 DBMS가 담당하는 부분
rollback 실행 시 이전 상태로 되돌리는 것도 DBMS가 담당하는 부분
개발자는 언제 commit 하거나 rollback 할지를 챙겨야 한다
Consistency (일관성)
A 계좌에 50만원
B 계좌에 50만원
A가 B에 60만원을 송금한다고 하면 어떻게 될까?
A의 계좌는 -10 만원이 된다.
계좌 테이블 제약조건은 0 이상이다.
DBMS는 해당 행위를 일관성을 깨트리는 행위로 판단하고 해당 SQL 문을 실행하지 않는다.
그럼 해당 SQL문이 실패 했으니 전체 트랜잭션이 롤백한다.
이처럼 일관성(Consistency)은 트랜잭션이 시작될 때와 종료될 때 데이터베이스가 일관된 상태를 유지해야 함을 의미한다. 트랜잭션 중간에 일관성이 깨지는 경우 트랜잭션은 롤백되어 데이터베이스의 무결성을 보장한다.
개발자는 application 관점에서 트랜잭션이 consistent하게 동작하는지 챙겨야 한다
Isolation(격리)
J가 H에게 20만원을 입금하는 트랜잭션 중간에
H가 본인에게 30만원을 입금하는 상황
J가 H에게 20만원을 입금하는 트랜잭션 read는 H가 본인에게 30만원을 입금하기 전에 계좌를 읽어서
결론적으로 30만원이 증발했다.
Isolation
여러 트랜잭션들이 동시에 실행될 때도 혼자 실행되는 것처럼 동작하게 만든다
DBMS는 여러 종류의 isolation level을 제공한다
개발자는 isolation level 중에 어떤 level로 트랜잭션을 동작시킬지 설정할 수 있다
concurrency control의 주된 목표가 isolation 이다.
Durability(영존성 / 영구성)
commit된 트랜잭션은 DB에 영구적으로 저장한다
즉, DB 시스템에 문제가 생겨도 commit된 트랜잭션은 DB에 남아 잇는다
'영구적으로 저장한다'라고 할 때는 일반적으로 비활성 메모리(HHD, SSD)에 저장함을 의미한다
기본적으로 트랜잭션의 durablility는 DBMS가 보장한다
'DataBase > MySQL' 카테고리의 다른 글
[MySQL] concurrency control 기초2 (recoverability) (1) | 2024.11.13 |
---|---|
[MySQL] concurrency control 기초1 (schedule, serializability) (1) | 2024.11.13 |
[MySQL] 트리거 trigger (3) | 2024.11.12 |
[MySQL] 스토어드 프로시저 stored procedure (3) | 2024.11.12 |
[MySQL] 스토어드 함수 stored function (1) | 2024.11.12 |