참고 - 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. 트랜잭션 사용 패턴
- transaction을 시작(begin)한다.
- 데이터를 읽거나 쓰는 등의 SQL문들을 포함해서 로직을 수행한다.
- 일련의 과정들이 문제없이 동작했다면 transaction을 COMMIT 한다.
- 중간에 문제가 발생했다면 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. 마무리
- transaction을 어떻게 정의해서 쓸지는 개발자가 정하는 것이다.
- 구현하려는 기능과 ACID 속성을 이해해야 transaction을 잘 정의할 수 있다.
- transaction의 ACID와 관련해서 개발자가 챙겨야 하는 부분들이 있다.
- DBMS가 모든 것을 알아서 해주는 것은 아니다.
참고
scaler