출처 : 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 후에 실행된 데이터 입력은 삭제되었다. |
'이전것 > 데이터베이스' 카테고리의 다른 글
[MS-SQL]MS-SQL에서 go란? (0) | 2017.01.26 |
---|---|
오라클과 MSSQL의 차이 차이점 (0) | 2017.01.24 |
4.4.3. CROSS JOIN, ON (0) | 2016.11.15 |
4.4.2. Outer Join ( LEFT, RIGHT, FULL OUTER JOIN ) (0) | 2016.11.15 |
4.4.1. Equi Join, Non_Equi Join, Self Join (0) | 2016.11.15 |