22/04/22 트랜잭션(COMMIT &ROLLBACK)

김석진·2022년 4월 22일
0

Oracle SQL

목록 보기
3/10

트랜잭션(commit과 rollback)

트랜잭션(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는 제거됨

COMMIT과 ROLLBACK의 예제

COMMIT과 ROLLBACK

  • 이전 COMMIT이 일어난뒤부터 다음 COMMIT전까지의 작업이 하나의 트랜잭션
  • COMMIT과 ROLLBACK은 이러한 트랜잭션단위로 데이터베이스에서 발생한 작업을 저장,삭제하는 일
    - 자동 COMMIT : DDL(CREATE,ALTER,DROP), DCL(GRANT,REVOKE)
    • 자동 ROLLBACK:비정상 적인 종료, system failure
SQL> DELTE 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 후에 실행된 데이터 입력은 삭제되었다.
profile
주니어 개발자 되고싶어요

0개의 댓글