본문으로 바로가기

트랜잭션 [Transaction]

category Database 2018. 4. 19. 14:30

트랜잭션 Transaction

 

데이터베이스 내에서 하나의 그룹으로 처리되어야 하는 명령문들을 모아 놓은 논리적인 작업 단위

 

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

 

여러개의 명령어의 집합이 정상적으로 처리되면 정상종료 / 하나의 명령어라도 잘못되면 전체 취소

 

왜 트랜잭션을 쓸까?

 

  -데이터의 일관성을 유지하면서 안정적으로 데이터를 복구

 

트랜잭션의 시작

 

 -실행 가능한 SQL문장이 제일 처음 실행될 때

 

트랜잭션의 종료

 

  -COMMIT이나 ROLLBACK

  -DDL이나 DCL문장의 실행(자동 COMMIT)

  -기계 장애, 정전 또는 시스템 충돌

  -deadlock 발생

  -사용자가 정상 종료

  

트랜잭션 상태도

 

 

 

 

트랜잭션의 특징

 

원자성(Atomicity) 

: 트랜잭션이 데이터베이스에 모두 반영되던가, 아니면 전혀 반영되지 않아야 함

 

일관성(Consistency)

: 트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 함

 

독립성(Isolation)

: 둘 이상의 트랜잭션이 동시에 병행 실행되고 있을 경우에 어느 하나의 트랜잭션이라도 다른 트랜잭션의 연산을 끼어들 수 없음

 

지속성(Durability)

: 트랜잭션이 성공적으로 완료됐을 경우, 결과는 영구적으로 반영되어야 함

 

 

 

COMMIT

  

-COMMIT은 변경한 데이터를 데이터베이스에 마지막으로 반영하고 현재의 트랜잭션을 종료하라는 명령어

  -COMMIT을 하면 트랜잭션의 처리과정이 모두 반영되며 하나의 트랜잭션 과정이 끝남

  -COMMIT하기 전 데이터가 저장됨

  -DDL(CREATE, DROP, ALTER, RENAME, TRUNCATE)은 AutoCommit임

  -정상적인 종료시에도 COMMIT 작업을 수행함 (EXIT로 종료)

 

ROLLBACK

 

 -ROLLBACK은 그 반대로 변경한 데이터를 변경(DML)을 취소하고 현재의 트랜잭션을 끝내라는 명령어

  -트랜잭션으로 인한 하나의 묶음처리가 시작되기 이전의 상태로 되돌려지는 것

  -이전 COMMIT한 곳까지만 복구가 됨

  -이전의 상태로 돌아가니 지금까지 수행했던 데이터베이스의 변경을 모두 무효화시킴

  -비정상적인 종료시 자동으로 ROLLBACK 작업을 수행함 (우측 상단 X버튼 클릭시, 정전, 컴퓨터가 Down시)

 

COMMIT 명령어와 ROLLBACK 명령어의 장점

 

  -데이터 무경성이 보장됨

  -영구적인 변경 전에 데이터의 변경 사항을 확인할 수 있음

  -논리적으로 연관된 작업을 그룹화할 수 있음

  -COMMIT, SAVEPOINT, ROLLBACK 문장으로 TRANSACTION의 논리를 제어할 수 있음

 

사용법

 

COMMIT;

ROLLBACK;

 

>예제를 보면서 이해하자

 

다음과 같이 원하는 테이블 생성 후 데이터를 입력 후 COMMIT을 입력하면 데이터베이스에 저장이 된다.

 

 

그럼 삭제를 해보자.

 

 

삭제를 한 후 rollback을 하게 되면

 

 

위와 같이 데이터가 다시 복구된다.

 

 

SAVEPOINT

 

  -현재까지의 트랜잭션을 특정 명칭으로 지정하여 임시로 저장을 해놓는 명령어

  -SAVEPOINT 명령어를 써서 현재의 트랜잭션을 작게 분할할 수 있음

  -SAVEPOINT 명령어를 써서 부분적인 롤백을 가능하게 하기 위해 트랜잭션에 대한 중간점을 정의함

  -저장된 SAVEPOINT는 ROLLBACK TO SAVEPOINT 문을 사용해서 표시한 곳까지 ROLLBACK을 할 수 있음

  -COMMIT 이전에 정의된 SAVEPOINT는 사용할 수 없음

 

사용법

 

SAVEPOINT 사용자가 정한 명칭;

---------------------------

ROLLBACK TO 사용자가 정한 명칭;

 

>예제를 보면서 이해하자

 

아까 테이블에서 행을 하나 더 추가하고 데이터를 넣었다.

 

아래와 같이 하면

 

 

현재 exex테이블에는 데이터가 없을 것이다.

 

SAVEPOINT를 써서 데이터를 살려보자

 

 

 

 

 

직접 정한 SAVEPOINT까지의 데이터는 복구가 되지만 ID가 2 인 '이학생'은 DELETE로 삭제 후 COMMIT을 하였기 때문에 ROLLBACK을 해도 복구가 되지 않는다.

 

'Database' 카테고리의 다른 글

SQL Developer 설치하기  (0) 2018.04.22
조인[JOIN]  (0) 2018.04.20
DML  (0) 2018.04.19
DDL  (0) 2018.04.19
[ORACLE]오라클 그룹함수  (0) 2018.04.19