트랜잭션 (Transaction) (p334 참조)
2. 트랜잭션의 제어 명령어
1) 커밋 (COMMIT)
- 모든 작업을 정상적으로 처리하겠다는 확정 명령어.
- 트랜잭션 처리 과정을 DB에 반영하기 위해 변경 내용을 모두 저장한다.
2) 롤백 (ROLLBACK)
- 작업 중 트랜잭션 처리 과정에서 발생한 변경사항을 취소하여 트랜잭션을 종료한다.
- 트랜잭션으로 인한 하나의 묶음 처리가 시작되기 이전 상태로 되돌린다.
ROLLBACK; -- DML 명령어를 수행하기 이전 상태로 되돌린다.
COMMIT 명령어와 ROLLBACK 명령어의 장점
- 데이터 무결성이 보장된다.
- 데이터 무결성 : 데이터의 정확성과 일관성을 유지하고 보증하는 것을 말한다.
- 영구적인 변경 전에 데이터의 변경 사항을 확인할 수 있다.
- 논리적으로 연관된 작업을 그룹화 할 수 있다.
롤백 세그먼트 : 롤백 이미지(이전 이미지)를 저장하는 객체. ROLLBACK SEGMENT(UNDO SEGMENT)라고 한다.
3) SAVEPOINT
트랜젝션을 작게 분할하여 표시한 곳까지 롤백할 수 있게 한다. ROLLBACK TO 명령어로 세이브포인트를 지정하여 되돌아갈 수 있다.
SAVEPOINT LABEL_NAME; -- 저장할 위치 지정
ROLLBACK TO LABEL_NAME; -- 저장한 위치로 롤백
데이터 읽기의 일관성과 락 (LOCK)
1. 데이터 읽기의 일관성과 락
- 오라클 사용자는 어느 시점에서든지 동일한 데이터를 일관적으로 읽을 수 있어야 한다.
- 여러 명의 사용자가 동시에 하나의 테이블에 접근해서 DML문으로 데이터베이스를 변경하면 오라클은 특정 사용자가 자원을 독점하지 못하게 하기 위해서 락(잠금)을 발생시킨다.
- 락이 걸리면 자원을 읽을 수 없는 무한 대기 상태가 된다.
- 락을 해제하려면 커밋이나 롤백을 실행해야 한다.
2. 데드 락 (Dead Lock) : 무한 교착 상태
- 데드락 : 서로 락을 풀어주기 전까지 대기 상태에 놓이는데, 대기 상태에서는 둘 다 락을 풀 수 없게 된다.
- 데드락 상태에 놓이면 오라클은 다음과 같은 메시지를 보내며 비정상 종료시킨다.
ORA-00060 : 자원 대기 중 교착 상태가 검출되었습니다.
- 비정상 종료를 하면 자동으로 롤백이 되어 데드락 상태에서 빠져나오게 된다.
커밋(Commit) |
롤백(Rollback) |
트랙잭션을 데이터베이스에 반영 |
트랜잭션을 데이터베이스에서 취소 |
락을 해제 |
락을 해제 |
트랙잭션이 종료 |
트랜잭션이 종료 |
정상 종료 시에는 자동 커밋이 된다. |
비정상 종료 시에는 자동 롤백이 된다. |
3. SET UNUSED
ALTER TABLE~DROP 명령어로 특정 컬럼을 삭제하면 먼저 컬럼의 모든 자료 삭제 후 컬럼이 삭제되어야 하므로 데이터가 많은 경우 작업 시간이 오래 걸릴 수 있다. 이 때 또다른 사용자가 해당 테이블에서 DML 작업을 하려고 하면 ALTER 구문으로 DDL 락이 걸려 있어 선행 작업이 끝날 때까지 기다려야 한다. 이 때 뒤의 사용자를 기다리지 않게 하는 방법이 SET UNUSED이다.
ALTER TABLE EMP02
SET UNUSED (JOB);
- 위와 같이 하면EMP02 테이블 상에서 JOB 컬럼이 보이지 않게 된다.
- 실제로는 존재하지만 논리적 사용을 제한하기 위해 UNUSED 속성이 지정되었기 때문이다.
- SET UNUSED는 해당 컬럼을 실제로 삭제한 것이 아니라 삭제한다는 표시만 한 것이므로 수행 시간은 짧으며 락이 걸리는 시간도 짧다.
ALTER TABLE EMP02
DROP UNUSED COLUMNS;
- 실제로 삭제한 것이 아니라 표시만 한 것이므로 사용 빈도가 적은 시간에는 해당 컬럼을 삭제해야 한다.
- 위와 같이 입력하면 UNUSED를 걸어둔 컬럼을 최종적으로 삭제할 수 있다.
4. DDL 명령의 롤백
- DDL은 자동 커밋이 일어나므로 이전 상태로 되돌릴 때 롤백을 할 수 없다.
- 테이블에서 컬럼을 삭제 전에 다른 테이블에 컬럼을 복사해둔다.
5. TRUNCATE와 DELETE의 차이
1) TRUNCATE : 모든 행을 삭제하기 위한 DDL 명령어. 자동 커밋으로 롤백 불가.
TRUNCATE TABLE table_name;
- 삭제하는 속도가 빠르다. 명확히 삭제할 때엔 TRUNCATE가 효율적.
2) DELETE : 행을 삭제하기 위한 DML 명령어. WHERE절로 원하는 행만 삭제 가능. 롤백 가능.
- 삭제하는 속도가 늦다.
'오라클 기초' 카테고리의 다른 글
SQL의 기본: TAB, DESC, NVL, AS, ||, DISTINCT (0) | 2016.01.13 |
---|---|
Oracle SQL Developer 설치 및 접속방법 (0) | 2016.01.12 |
테이블 만들고 데이터 입력하기 연습 (0) | 2016.01.06 |
SELECT문: WHERE 조건과 연산자, ORDER BY절 (0) | 2016.01.06 |
테이블에 관한 SQL문 (0) | 2016.01.06 |