DBMS

[DBMS_14] TRANSACTION (rollback 과 commit)

korany 2023. 3. 10. 11:55

 

트랜잭션이란?

DB의 상태를 변화시키기 위해 수행하는 작업의 단위

INSERT / DELETE / UPDATE 

작업을 완료한 뒤 COMMIT 필수!

 

1. 커밋 안했을때 rollback 하기

 

-- 사원테이블의 전체 사원 수 조회
SQL> select count(*) from empl;

  COUNT(*)
----------
       107


-- 사번이 100번인 사원을 삭제
SQL> DELETE FROM empl WHERE employee_id = 100;

1 row deleted.

 

--위의 삭제 코드에서 commit을 하지 않아도 내부적으로는 쿼리문이 실행중
SQL> select count(*) from empl;

  COUNT(*)
----------
       106

 

--empl테이블의 데이터를 수정

SQL> UPDATE empl SET first_name = 'A';

106 rows updated.

 

아차차 실수! 이전으로 돌아갈래ㅜㅜ

-- 위의 코드처럼 실수로 잘못 작성된 쿼리문이 있거나 

전달이 정상적으로 되지 않은 쿼리문이 있는 경우

rollback; 키워드를 통해서

commit;직전 단계까지로 돌아갈 수 있다.

 

SQL> rollback;

Rollback complete.

SQL> select count(*) from empl;

  COUNT(*)
----------
       107


2. 이미 커밋 했을때 rollback 하기

UPDATE empl SET first_name = 'B';

COMMIT;

실수로 잘못들어간 데이터를 commit까지 해버렸을때 rollback; 못함!ㅠㅠ

 

하지만

commit이 진행 된 이후에 이전단계로 rollback을 원한다면??

1) empl 삭제

DELETE FROM empl;

 

2) rollback을 원하는 시간대로 돌아가서 테이블을 재 조회 하고 INSERT

INSERT INTO empl

SELECT * FROM empl as of timestamp( systimestamp-interval '10' minute );

commit;

 

as of timestamp( systimestamp-interval '원하는 시간' 단위 );

-- '1' minute : 1분전
-- '2' hour : 2시간 전
-- '3' day : 3일 전