트랜잭션 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 |