1. 트랜잭션(Transaction)이란?
트랜잭션은 거래라는 뜻으로, 하나의 그룹으로 처리되어야하는 명령문(SQL)들을 모아놓은 논리적인 작업 단위이다.
2. 트랜잭션의 예시
거북이가 토끼에게 10,000원을 이체를 한다.
트랜잭션
1. 거북이 통장 잔액 조회 (select)
2. 거북이 통장 잔액에서 10,000원 차감 (update)
거북이 통장 ------> 3. 토끼 계좌번호 조회 (selece) -----------> 토끼 통장
4. 토끼 통장 잔액에서 10,000원 증가 (update)
거북이 통장에서 토끼 통장으로 10,000원을 옮기는 1~4번의 과정의 그룹을 트랜잭션이라고 한다.
거래 도중 오류가 발생했을 때는 이 거래를 없었던 거래로 완전히 처음으로 되돌리는 것이다.
거래의 안정성을 확보하는 방법이 트랜 잭션이다.
3. 트랜잭션의 특징 (ACID)
1) 원자성 (Atomicity)
: All or Nothing.
만약, 토끼의 계좌번호를 조회했는데 존재하지 않는 계좌번호라면, 1, 2번의 과정 또한 실행 되지 않은 상태로 되어야 한다.
즉, 부분적으로 실행되지 않고 모두 성공적으로 반영되거나 아니면 전혀 반영되지 않아야 한다.
2) 일관성 (Consistence)
: 시스템이 가지고 있는 고정 요소는 트랜잭션 수행 전과 수행 완료 후의 상태가 동일하다.
3) 독립성 (Isolation)
: 둘 이상의 트랜잭션이 동시에 병행 실행되는 경우 어느 하나의 트랜잭션 실행 중에 다른 트랜잭션의 연산에 끼어 들 수 없다.
4) 영속성 (Durability)
: 성공적으로 반영된 내용은 영원히 반영 되어야 한다.
4. TCL(Transaction Control Language, 트랜잭션 제어어)
1) COMMIT(커밋)
: 하나의 트랜잭션인 여러 DML(Insert, Update, Delete) 명령어를 정상적으로 DB에 반영한다.
트랜잭션을 완료하는 의미의 명령어
이전 데이터는 영원히 잃어버리게 된다.
insert into appliance_stock (name, number, price)
values ('냉장고', 1, 2000000);
commit;
appliance_stock 테이블에 1 row가 insert 된 것을 확인 할 수 있다.
*** 보통 AUTO COMMIT 이다. 따로 COMMIT 명령어를 할 필요가 없다.
2) ROLLBACK(롤백)
: 하나의 트랜잭션가 실패시 작업을 취소하고 트랜잭션 실행 이전으로 되돌리는 명령어
insert into appliance_stock (name, number, price)
values ('냉장고', 1, 2000000);
ROLLBACK;
appliance_stock 테이블에 1 row가 insert가 되지 않은 것을 확인 할 수 있다.
*** ROLLBACK이 되지 않는다면, AUTO COMMIT인지 확인해보기
3) SAVEPOINT(CHECKPOINT)
: 현재 트랜잭션을 작게 분할하는 명령어
지정된 SAVEPOINT까지 ROLLBACK이 가능하다.
appliance_stock 테이블에는 현재 데이터가 존재하지 않는다.
insert into appliance_stock (name, number, price)
values ('냉장고', 1, 2000000);
--세이브포인트 S1으로 지정
SAVEPOINT S1;
insert into appliance_stock (name, number, price)
values ('TV', 2, 1500000);
--세이브포인트 S2로 지정
SAVEPOINT S2;
delete from appliance_stock
where name = '냉장고';
ROLLBACK TO S2;
ROLLBACK TO S1;
ROLLBACK;
- ROLLBACK TO S2 : 세이브포인트 S2 지점으로 롤백
---> 결과 : appliance_stock 테이블에 냉장고와 TV가 insert 되어 있다. - ROLLBACK TO S1 : 세이브포인트 S1 지점으로 롤백
----> 결과 : appliance_stock 테이블에 냉장고가 insert 되어 있다. - ROLLBACK : 맨 처음으로 롤백
----> 결과 : appliance_stock 테이블에 데이터가 존재하지 않는다.
'개발 > 개발노트' 카테고리의 다른 글
[Web] Web Server? WAS? (0) | 2023.04.15 |
---|---|
[Network] REST, REST API, RESTful (0) | 2023.04.12 |
[Network] Blocking I/O, Non-blocking I/O (0) | 2023.04.08 |
Blocking, Non-blocking & Synchronous, Asynchronous 차이점 (1) | 2023.04.05 |
[TCP/IP] 인터넷 계층 프로토콜 (IP, ICMP, IGMP, ARP, RARP) (0) | 2021.03.28 |