출처 : http://www.gurubee.net/lecture/1403

트랜잭션(TRANSACTION)

- 트랜잭션은 데이터 처리의 한 단위이다.

- 오라클 서버에서 발생하는 SQL문들이 하나의 논리적인 작업 단위로써 성공하거나 실패하는 일련의 SQL문을 트랜잭션이라 보면된다.

- 오라클 서버는 트랜잭션을 근거로 데이터의 일관성을 보증한다.

- 트랜잭션은 데이터를 일관되게 변경하는 DML문장으로 구성된다 (COMMIT, ROLLBACK, SAVEPOINT)


TRANSACTION의 시작

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

TRANSACTION의 종료 

- COMMIT이나 ROLLBACK

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

- 기계 장애 또는 시스템 충돌(crash)

- deadlock 발생

- 사용자가 정상 종료


자동 COMMIT은 다음의 경우 발생한다.

- DDL, DCL 문장이 완료 될 때

- 명시적인 COMMIT이나 ROLLBACK없이 SQL*Plus를 정상 종료 했을 경우


자동 ROLLBACK은 다음의 경우 발생한다. 

- SQL * Plus를 비정상 종료 했을 경우

- 비정상적인 종료, system failure


COMMIT과 ROLLBACK

- COMMIT : 변경사항 저장

- ROLLBACK : 변경사항 취소


COMMIT과 ROLLBACK의 장점

- 데이터의 일관성을 제공한다.

- 데이터를 영구적으로 변경하기 전에 데이터 변경을 확인하게 한다.

- 관련된 작업을 논리적으로 그룹화 할 수 있다.

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


COMMIT이나 ROLLBACK 이전의 데이터 상태

- 데이터 이전의 상태로 복구가 가능하다.

- 현재 사용자는 SELECT문장으로 DML 작업의 결과를 확인할 수 있다.

- 다른 사용자는 SELECT 문장으로 현재 사용자 사용한 DML문장의 결과를 확인할 수 없다.

- 변경된 행은 LOCK이 설정되어서 다른 사용자가 변경 할 수 없다.


COMMIT 이후의 데이터 상태 

- 데이터베이스에 데이터를 영구적으로 변경

- 데이터의 이전 상태는 완전히 상실

- 모든 사용자가 결과를 볼 수 있다.

- 변경된 행의 LOCK이 해제되고 다른 사용자가 변경할 수 있다.

- 모든 SAVEPOINT는 제거된다.


SQL> DELETE FROM emp WHERE empno = 7521 ;

한 개의 행이 삭제 되었습니다.


SQL> COMMIT;

커밋이 완료 되었습니다

 

-- 한 개의 행을 삭제하고, COMMIT 문으로 데이터를 영구히 저장했다. 

-- 이 것은 하나의 트랜잭션이 여기서 종료되고,

    새로운 트랜잭션이 발생하는 것을 말한다.



SQL> SELECT empno FROM emp WHERE empno = 7521;

선택된 레코드가 없습니다.


SQL> INSERT INTO emp(empno, ename, hiredate) 

     VALUES (9000, 'test', sysdate );

한 개의 행이 작성되었습니다.


SQL> COMMIT;

커밋이 완료 되었습니다.


SQL> DELETE FROM emp WHERE empno = 9000;

한 개의 행이 삭제 되었습니다.


SQL> SELECT empno FROM emp WHERE empno = 9000 ;

선택된 레코드가 없습니다.  


-- 위의 예제 처럼 empno가 9000번인 데이터를 등록 한 후 

   COMMIT으로 데이터를 저장한 다음에 데이터를 다시 삭제한 후 

   SELECT를 하면 데이터가 검색되지 않는 것을 알 수 있다.


-- 하지만 다른 유저에서는 커밋이나 롤백을 하기 전까지 이전에 등록한 

   empno가 9000번인 데이터를 조회하면 데이터가 검색 된다.


-- 데이터베이스에서의 이런 기능을 읽기 일관성이라고 합니다.



SQL> ROLLBACK ;

롤백이 완료되었습니다.


-- 이전에 트랜잭션(커밋)이 발생하고나서 지금 발생한 ROLLBACK문 

     전까지의 작업의 취소를 말한다.


-- 검색을 해보면 커밋이 완료된 시점의 레코드 하나가 검색 된다.

SQL> SELECT empno FROM emp WHERE empno = 9000;


   EMPNO

----------

    9000

한 개의 행이 선택되었습니다. 


SAVEPOINT 와 ROLLBACK TO

SAVEPOINT는사용자가 트랜잭션의 작업을 여러개의 세그먼트로 분할할 수 있도록 하는 특별한 작업이다.


SAVEPOINT는 부분적인 롤백을 가능하게 하기 위해 트랜잭션에 대한 중간점을 정의 한다.


SQL> INSERT INTO emp(empno, ename, hiredate) 

     VALUES (10000, 'test2', sysdate );

한 개의 행이 작성되었습니다.


-- SAVEPOINT를 생성 한다.

SQL> SAVEPOINT A;

저장점이 생성되었습니다. 


SQL> INSERT INTO emp(empno, ename, hiredate) 

     VALUES (10001, 'test3', sysdate );

한 개의 행이 작성되었습니다.


SQL> INSERT INTO emp(empno, ename, hiredate) 

     VALUES (10002, 'test4', sysdate );

한 개의 행이 작성되었습니다.


SQL> DELETE FROM emp 

     WHERE empno IN (10000, 10001, 10002);

세 개의 행이 삭제 되었습니다.


SQL> SELECT empno, ename 

     FROM emp 

     WHERE empno IN (10000, 10001, 10002);

선택된 행이 없습니다.


-- SAVEPOINT까지만 롤백이 시행 된다.

SQL> ROLLBACK TO A;

롤백이 완료되었습니다. 


SQL> SELECT empno, ename 

     FROM emp 

     WHERE empno IN (10000, 10001, 10002);

한 개의 행이 선택되었습니다.


     EMPNO ENAME

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

    10000 test2


-- SAVEPOINT까지만 롤백이 실행되었다. 

-- 그 결과 첫 번재 데이터는 그대로 남고, SAVEPOINT 후에 실행된 데이터 입력은 삭제되었다. 


블로그 이미지

잉비니

,