트랜잭션 (Transaction) (p334 참조)


- 데이터 처리의 한 단위로, 오라클에서 발생하는 여러 개의 SQL 명령문들을 하나의 논리적인 작업 단위로 처리한다. 
- 트랜잭션은 마지막으로 실행한 커밋(혹은 롤백) 명령 이후부터 새로운 커밋(혹은 롤백) 명령을 실행하는 시점까지 수행된 모든 DML 명령을 의미한다.

1. 트랜잭션의 처리 방식 : All-OR-Nothing
명령어 여러 개의 집합이 정상적으로 처리되면 정상 종료하고, 하나의 명령어라도 잘못되었다면 전체를 취소한다.


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절로 원하는 행만 삭제 가능. 롤백 가능.

DELETE FROM table_name
WHERE conditions;

- 삭제하는 속도가 늦다.








Posted by netyhobby
,