본문 바로가기
데이터베이스

트랜잭션

by do_ng 2021. 3. 19.

<트랜잭션 개념>

 

은행에서의 계좌이체의 상황) 

 

1. 자신의 계좌에서 잔액을 확인하고 이체할 금액을 인출한다. 

2. 이체할 계좌에 돈을 넣는다. 

 

-> 첫번째 작업에서 이체할 금액 1억원을 인출했는데 갑작스럽게 정전이 일어났다던가 어떠한 오류에 의해서 프로그램이 비정상적으로 종료되었을 때 인출한 1억원은 복구가 되어야 한다. 

 

즉 계좌이체라는 작업 단위는 두 가지의 작업이 모두 성공적으로 완료되었을 때 종료가 되야 한다.

만약에 둘 중 하나라도 실패할 경우 금액은 처음의 상태로 되돌아 가야 한다. 

 

이러한 계좌이체 같은 하나의 논리적인 작업 단위를 구성하는 연산들의 집합을 트랜잭션이라고 하고 

트랜잭션의 대상이 되는 SQL문은 UPDATE,INSERT,SELECT 총3가지 명령어로 SELECT 구문은 트랜잭션의 대상에 포함되지 않는다. (SELECT FOR UPDATE 등 배타적 LOCK을 요구하는 SELECT문장은 트랜잭션의 대상이 될 수 있음) 

 

1. Commit

- 트랜잭션이 성공적으로 수행된 후 데이터베이스에 반영(변경된 내용을 DB에 영구 저장)  

- 모든 작업을 정상적으로 처리하겠다고 확정시키는 명령어 

* commit을 할 경우 이전의 상태로 되돌릴 수 없으므로 주의! *

- 기본적으로 auto commit이 되어 있는 경우가 많으므로 트랜잭션을 처리할 때는 auto commit을 해제해야 된다. 

 

2. RollBack 

- 트랜잭션 처리 과정중 해당 작업에서 문제가 발생했을 때 변경 사항을 취소(Rollback)처리 하고 트랜잭션이 실행되기 이전의 상태로 되돌림 

 

참고 : kimsg.tistory.com/258

 

3. SavePoint

- Rollback 처리 할 때 트랜잭션에 포함된 전체 작업을 되돌리는 것이 아니라 현 시점에서 SavePoint까지 트랜잭션의 일부만 Rollback 처리 할 수 있습니다.

복잡한 대규모 트랜잭션에서 에러가 발생했을 때 SavaPoint까지만 롤백처리하고 실패한 작업만 다시 처리를 함으로써 트랜잭션 전체를 롤백처리하는 것보다 좀더 빠른 효율을 기대할 수 있다. 

 

ex) SavePoint 예시(MySQL 기준) 

 

create table a(
   id VARCHAR(30) NOT NULL
);

 

SET AUTOCOMMIT = FALSE; // COMMIT 수동처리하기 

 

START transaction; // 트랜잭션 시작 

 

savepoint a; 
insert into a(id) values('수원');

savepoint b; 
insert into a(id) values('부산');

savepoint c; 
insert into a(id) values('대구');

 

=> 수원,부산,대구를 insert 처리후 "rollback to savepoint c" 하게되면 대구가 insert 되기전인 수원,부산만 insert 처리됬을 때로 rollback 처리가 된다. 

 

=> 그냥 Rollback 처리를 하게되면 트랜잭션 시작시점으로 돌아가게 된다. 

 

참고 : 88240.tistory.com/458

 

 

<트랜잭션의 특성>

- 계좌를 이체하는 과정을 보면 한 계좌에서 현금이 인출된 후에 해당 계좌로 입금이 되는데, 현금이 인출되기 전에 누군가가 해당 계좌로 입금을 하게된다면 문제가 발생될 수 있다. 

 

즉, A가 B의 계좌로 이체를 하는 동안에 C라는 사람이 개입해서 작업을 처리하게 되면 오류가 발생했을 때 해결하는 과정이 복잡해지고 잘못된 결과가 나올수 있으므로 트랜잭션은 기본적으로 LOCK(잠금)을 통해서 트랜잭션이 수행되는 동안에는 다른 트랜잭션이 접근을 못하도록 제한 할 수 있다. 

(트랜잭션이 끝나고 commit 된 이후에 LOCK이 풀림) 

'데이터베이스' 카테고리의 다른 글

대량 데이터에 따른 성능 관리  (0) 2021.03.22
정규화  (0) 2021.03.22
스토어드 프로그램이란?  (0) 2020.12.23
오라클 PL/SQL  (0) 2020.11.27
MySQL 완전삭제하기  (0) 2020.06.17