* 트랜잭션
-> 마지막으로 실행한 커밋 명령 이후부터 새로운 커밋 명령을 실행하는 시점까지 수행된 DML 명령들을 말한다. 예를 들어 2시간 전에 커밋을 실행하고 나서 3개의 DML을 수행했다고 보자. 그리고 이제 새로운 커밋을 실행하려고 한다면 그 2시간 동안 수행됐던 3개의 DML 명령들이 하나의 트랜잭션이라고 볼 수 있다. 트랜잭션이 어떤 명령이든 하나의 명령 실행을 이야기하는 것으로 오해하는데 하나의 트랜잭션은 하나 또는 여러 개의 DML 명령을 모두 묶어서 의미할 수 있다. 다시 말해 트랜잭션은 커밋과 커밋 사이에 발생한 모든 DML을 의미한다는 것이다.
-> DDL 문장 같은 경우 하나하나의 문장이 수행될 때마다 내부적으로 자동 커밋이 발생하므로 하나하나의 문장이 하나의 트랜잭션이라고도 말할 수 있다.
* 트랜잭션의 종료
-> 트랜잭션이 종료되는 데는 여러 이유가 있지만 가장 큰 이유는 해당 트랜잭션이 커밋 또는 롤백되는 순간이다. 그다음으로 트랜잭션의 종료는 DDL 명령의 실행이다. DDL 문장은 DML 문장과는 다르게 인위적으로 커밋을 수행시킬 필요가 없다. DDL 문장의 경우는 DDL 문장이 실행돼서 종료되는 순간 자동 커밋이 내부적으로 발생하기 때문이다. 또 다른 이유로는 시스템에 문제가 발생하여 시스템 자체가 문제를 야기시키는 경우이다. 예를 들어 2시간 동안 임의의 트랜잭션이 수행되고 있는 동안에 갑자기 시스템에 문제가 발생하는 경우 오라클은 그동안의 트랜잭션을 종료시키고 롤백을 수행한다.
* 커밋 (Commit)
-> 커밋이란 이러한 트랜잭션이 발생하는 경우 변경 정보인 리두 로그가 리두 로그 버퍼로부터 리드 로그 파일로 물리적으로 저장하는 과정을 말한다. 커밋을 하면 다시는 완료된 트랜잭션으로 인하여 변경된 데이터를 복구할 방법이 없다. 그리고 커밋에는 자동 커밋 (Automatic)과 인위적 커밋 (Manual commit)이라는 두 가지 종류가 있다.
-> 커밋이 발생하기 전에는 해당 로우에 대한 잠금(Lock)이 걸리게 되며 이로 인하여 다른 사용자들은 해당 로우에 대한 갱신을 할 수 없게 된다. 하지만 일단 커밋이 되고 나면 해당 로우에 걸려있던 잠금이 해제되며 비로소 다른 사용자들이 해제된 로우에 대하여 작업이 가능해진다.
* 자동 커밋 : DDL 문장이 실행되는경우, SQL*Plus 유틸리티를 정상적으로 종료하는 경우
* 롤백 (Rollback)
-> 임의의 DML 트랜잭션이 실행되고 있다 하더라도 그 DML 트랜잭션이 커밋되기 전에는 언제든지 트랜잭션이 발생하기 전 상태로 돌아갈 수 있다. 롤백이 발생하는 이유는 여러 가지가 있겠지만 가장 빈번하게 발생하는 경우는 임의의 트랜잭션이 수행되는 동안 내부적으로 에러가 발생하여 트랜잭션이 실패로 끝나는 경우이다. 오라클은 이러한 경우 자동적으로 현재 진행하고 있던 트랜잭션의 롤백을 수행한다. 또 다른 경우는 트랜잭션을 수행하는 사용자 자신이 실행하고 있는 트랜잭션에 문제가 있다는 사실을 인지하고 의도적으로 현재 진행하고 있던 트랜잭션을 롤백시키는 경우이다.
-> DDL 문장의 경우는 롤백을 적용하는 의미가 없다. DDL 문장은 종료되는 순간에 이미 자동적으로 커밋이 발생하기 때문에 다시 롤백한다는 개념을 적용할 수 없다. 그러므로 DDL문장을 실행할 때는 주의를 요구한다. 왜냐하면 일단 DDL 문장이 종료된 다음에는 롤백 명령을 사용해서 다시 원상태로 돌아갈 방법이 없기 때문이다. (하지만 방법은 존재한다.)
* 세이브포인트 (Savepoint)
-> 오라클에서는 임의의 트랜잭션을 롤백할 때 사용할 수 있는 세이브포인트라는 또 다른 옵션을 제공한다. 일반적으로 롤백은 최근 실행한 커밋 이후 발생한 모든 트랜잭션을 원상태로 돌려주는 역할을 하는데 세이브포인트를 사용하게 되면 사용자가 롤백을 원할 때 모든 트랜잭션을 롤백하는 게 아니라 원하는 세이브 포인트로만 롤백할 수 있도록 해준다.
Step1) Commit : 여기서부터 시작
Step2) Delete 문장 실행
Step3) Savepoint A 설정
Step4) Update 문장 실행
Step5) Insert 문장 실행
Step6) Savepoint B 설정
Step7) Update 문장 실행
Step8) Rollback to savepoint B
-> Step8을 실행하게 되면 전체 트랜잭션을 모두 롤백하는 것이 아니라 바로 Step7에서 실행했던 Update 문장만이 롤백된다. 만일 Rollback to savepoint A라고 한다면 Step4, Step5, Step6, Step7까지 실행한 Update 문장, Insert 문장, Savepoint A 문장 그리고 두 번째 실행된 Update 문장까지 롤백하는 결과를 가져다준다. 그리고 커밋이 실행되는 동시에 설정되었던 모든 세이브포인트가 해제된다는 사실도 염두에 두어야 한다.
* 문장 레벨 롤백 (Statement level rollback)
-> 하나의 트랜잭션 내에서 여러 개의 DML 문장을 실행하고자 할 때 그 중 하나의 DML 문장 실행이 실패로 돌아갔다면 어떤 식으로 롤백이 되는지 확인해보자.
Step1) Commit 실행 (새로운 트랜잭션의 시작)
Step2) Insert 문장 실행 (성공)
Step3) Update 문장 실행 (성공)
Step4) Delete 문장 실행 (실패)
-> 이러한 경우 Step4에서 실행한 Delete 문장만이 자동적으로 롤백되고 그 이전에 발생한 Step2와 Step3에서 성공적으로 수행된 문장들은 커밋 또는 롤백되기를 기다리며 그대로 남아있게 된다. 따라서 이러한 경우에는 Step2와 Step3에 대한 커밋 또는 롤백은 인위적으로 수행해줘야 한다.
'Operating System > ORACLE' 카테고리의 다른 글
[ORACLE] 제약 조건 (Constraints) (0) | 2022.02.11 |
---|---|
[ORACLE] 데이터 잠금 (Locking) (0) | 2022.02.10 |
[ORACLE] DML (With Check Option) (0) | 2022.02.08 |
[ORACLE] 테이블 조인 ( TABLE join ) (2) | 2022.02.07 |
[ORACLE] Date 데이터 타입에 대한 출력 형식 (0) | 2022.02.04 |