티스토리 뷰

Database

[SQL] Transaction(트랜잭션)

쩨리쩨리 2018. 4. 24. 10:20
반응형

* 트랜잭션(Transaction)

- 트랜잭션이란 '거래'라는 뜻으로 데이터베이스 내에서 하나의 그룹으로 처리되어야 하는 명령문들을 모아 놓은 논리적인 작업 단위이다.

- 데이터베이스 응용 프로그램은 트랜잭션들의 집합으로 정의 할 수 있다.

- 여러 단계의 처리를 하나의 처리처럼 다루는 기능이다.

- 여러 개의 명령어의 집합이 정상적으로 처리되면 정상 종료된다.

- 하나의 명령어라도 잘못되면 전체 취소된다.

- 트랜잭션을 쓰는 이유는 데이터의 일관성을 유지하면서 안정적으로 데이터를 복구하기 위함이다.

 

 

 

 

* 트랜잭션 필요성

1. 트랜잭션은 '거래'라는 뜻으로, 은행에서 입금과 출금을 하는 그 거래를 뜻한다.

2. A 은행에서 출금하여 B은행으로 송금한다고 가정하자.

3. 송금한느 중에 알 수 없는 오류가 발생하여 A은행 계좌에서 돈이 빠져 나갔는데 B은행 계좌에 입금되지 않았다.

4. 이때, 우리는 A은행 계좌의 출금을 취소하거나, 출금된 금액만큼 B은행 계좌로 다시 송금하면 된다.

5. 하지만 이 방법은 번거롭고 더 심한 오류를 발생시킬수 있다.

6. 그래서 생각해낸 해결책이, 거래가 성공적으로 모두 끝난 후에야 이를 완전한 거래로 승인하고, 거래 도중 뭔가 오류가 발생했을 때는 이 거래를 아예 처음부터 없었던 거래로 되돌리는 것이다.

7. 이렇게 거래의 안전성을 확보하는 방법이 트랜잭션이다.

8. 데이터베이스에선 테이블에서 데이터를 읽어 온 후 다른 테이블에 데이터를 입력하거나 갱신, 삭제하는데 처리 도중 오류가 발생하면 모든 작업을 원상태로 되돌린다.

9. 데이터베이스에선 처리 과정이 모두 성공했을 때만 최종적으로 데이터베이스에 반영한다.

 

 

 

그림으로 보고 다시 이해해보자.

 

 

 

 

 

 

[1], [2]번까지 잘 실행되다가 [3]번 작업 시 소프트웨어가 중단되거나 하드웨어가 고장이 발생하여 작업에 오류가 생긴다면?

[2]번까지의 모든 작업을 취소하고 트랜잭션 작업 전인 데이터베이스 초기 상태로 돌아가게 된다.

 

 

 

 

 

* 트랜잭션의 특징

 

 

 

 

* 트랜잭션 상태

- 트랜잭션에는 내가 적은 쿼리문과 데이터를 최종적으로 데이터베이스에 반영하는 COMMIT과 실패했을때 COMMINT 시점으로 다시 되돌아가는 ROLLBACK이 있다.

1. 활동 : 트랜잭션이 실행 중에 있는 상태, 연산들이 정상적으로 실행 중인 상태

2. 실패 : 트랜잭션이 실행에 오류가 발생하여 중단된 상태

3. 철회 : 트랜잭션이 비정상적으로 종료되어 ROLLBACK 연산을 수행한 상태

4. 부분적 완료 : COMMIT 연산이 실행되기 직전의 상태로 아직 작성한 것들을 저장하지 않은 상태

5. 완료 : 트랜잭션이 성공적으로 종료되어 COMMIT 연산을 실행한 후의 상태

 

 

 

 

 

* COMMIT

- 완전 저장

- COMMIT이란 모든 작업들을 정상적으로 처리하겠다고 확정하는 명령어로 처리과정을 DB에 영구 저장하는 것이다.

- COMMIT을 수행하면 하나의 트랜잭션 과정을 종료하는 것이다.

- COMMIT을 수행하면 이전 데이터가 완전히 UPDATE 된다.

 

 

 

 

- 위 그림에서 첫번째 COMMIT후 그 뒤에 UPDATE 문으로 데이터를 갱신하고(3), DELETE문으로 데이터를 삭제하고(4), INSERT 문을 사용해 데이터를 삽입(5)한다.

- 만약 이 모든 과정이 오류 없이 수행되었다면 지금까지 실행한 모든 작업(3,4,5)을 데이터베이스에 영구 저장하라는 명령으로 COMMIT을 수행한다.

 

 

 

 

 

 

* ROLLBACK

- ROLLBACK은 작업 중 문제가 발생되어 트랜잭션의 처리과정에서 발생한 변경사항을 취소하는 명령어 이다.

- 트랜잭션이 시작되기 이전의 상태로 되돌린다.

- 즉, 마지막 COMMIT을 완료한 시점으로 다시 돌아간다.

- COMMIT하여 저장한 것만 복구한다.

 

 

 

 

- 위 그림에서 ROLLBACK 명령은 마지막으로 수행한  COMMIT 명령까지만 청상처리(1,2)된 상태로 유지한다.

- 그 이후에 수행했던 모든 DML 명령어 작업(3,4,5)들을 취소시켜 이전 상태로 원상 복귀 시킨다.

- 트랜잭션은 이렇든 ALL-OR-Nothing 방식으로 DML 명령어들을 처리한다.

- ALL-OR-Nothing이란 '모든것을 수행하던지 아무것도 하지말던지'라는 의미이다.

 

 

 

 

 

* SAVEPOINT

- 임시저장

- 보통 ROLLBACK을 명시하면 INSERT, DELETE, UPDAT 등의 작업 전체가 취소되는데 전체가 아닌 특정 부분에서 트랜잭션을 취소시킬 수 있다.

- SAVEPOINT를 쓰면 현재의 트랜잭션을 작게 분할 가능하다.

- SAVEPOINT는 여러 개의 SQL문의 실행을 수행하는 트랜잭션의 경우에 사용자가 트랜잭션 중간 단계에서 SAVEPOINT를 지정할 수 있다.

- SAVEPOINT를 쓰려면 취소하려는 지점을 명시한 뒤, 그 지점까지 작업을 취소하는 식으로 사용하는데 이 지점을 SAVEPOINT라고 한다.

- SAVEPOINT를 지정한뒤 ROLLBACK TO SAVEPOINT이름;을 실행하면 지정한 해당 SAVEPOINT 지점까지 처리한 작업이 취소(ROLLBACK)된다.

- 기본형태 :

SAVEPOINT 세이브포인트이름;

- ROLLBACK 형태 :

ROLLBACK TO 세이브포인트이름;

 

 

 

 

- 위 그림에서 COMMIT 명령이 내려진 후 다음 COMMINT 명령이 나타날 때까지가 하나의 트랜잭션으로 구성되므로 2번~4번 까지가 하나의 트랜잭션이다.

- 이렇게 트랜잭션을 구성할때 중간 중간 SAVEPOINT 명령으로 위치를 지정해 놓으면 하나의 트랜잭션 내에서도 ROLLBACK TO SAVEPOINT 문을 사용하여 표시한 곳까지 ROLLBACK 가능하다.

 

 

 

예제를 이용하여 이해해보자.

 

 

* SAVEPOINT 예제

1. 테이블 생성 후 데이터 삽입

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE TABLE tran(
  id number NOT NULL Primary key,
  first_name varchar2(20),
  last_name varchar2(20),
  age varchar2(10),
  birth date
   );
 
INSERT INTO trat3 values(2012,'황','요셉','26','92.06.18');
   INSERT INTO trat3 values(2014,'심','준식','24','95.01.12');
   INSERT INTO trat3 values(2015,'서','예슬','23','95.05.22');
   INSERT INTO trat3 values(2011,'김','도훈','28','91.09.26');
SELECT * FROM TRAT3;
 
COMMIT;
cs

 

 

2. 삭제할때마다 SAVEPOINT를 정해준다.

1
2
3
4
5
6
7
8
9
DELETE FROM TRAT3 WHERE ID=2012;
COMMIT;
SAVEPOINT S1;
DELETE FROM TRAT3 WHERE ID=2014;
SAVEPOINT S2;
DELETE FROM TRAT3 WHERE ID=2015;
SAVEPOINT S3;
DELETE FROM TRAT3 WHERE ID=2011;
ROLLBACK TO S2;
cs

- 맨 마지막에 ROLLBACK TO S2를 선언했으니, S2로 돌아간다.

 

 

3. 주의사항

1
2
3
4
5
6
7
8
9
10
11
12
DELETE FROM TRAT3 WHERE ID=2012;
COMMIT;
SAVEPOINT S1;
DELETE FROM TRAT3 WHERE ID=2014;
SAVEPOINT S2;
DELETE FROM TRAT3 WHERE ID=2015;
SAVEPOINT S3;
DELETE FROM TRAT3 WHERE ID=2011;
ROLLBACK TO S2;
SELECT * FROM TRAT3;
COMMIT;
ROLLBACK  TO S1;
cs

- SAVEPOINT를 여러개 만들고 난뒤 COMMIT을 하면 앞에 있던 SAVEPOINT는 전부 날라가고 COMMIT까지만 완료된다.

- 따라서 12번 줄의 ROLLBACK TO S1은 오류가 뜬다.

 

 

 

 

 

 

반응형
댓글
공지사항