초급의 끄적거림

[SQL] 트랜잭션 (Transaction) 본문

DB/Oracle

[SQL] 트랜잭션 (Transaction)

codingD 2019. 7. 30. 13:21

[트랜잭션 (Transacion)]

⊙ 동시에 다수의 작업을 독립적으로 안전하게 처리하기 위한 상호 작용 단위

⊙ 일처리 단위

⊙ 분할할 수 없는 최소단위

⊙ 목적 : 안전한 거래 보장

 

 

[트랜잭션의 특성]

⊙ 원자성 : 트랜잭션은 한꺼번에 완료되거나 한꺼번에 취소 되어야 함

⊙ 일관성 : 트랜잭션 실행 전과 후 동일하게 오류가 없어야 함

⊙ 고립성 : 트랜잭션 실행 중 다른 트랜잭션에 영향을 받지 않아야 함

⊙ 지속성 : 트랜잭션 결과는 항상 보존됨

 

 

[TCL 명령어]

⊙ commit     : 거래 내역을 확정함

⊙ rollback     : 거래 내역을 취소함 (commit 하고 나오면 rollback 불가)

⊙ checkpoint : rollback 할 위치를 지정함

 

 

[실습] : sqlplus에서 테스트

 - 시작 → 명령프롬프트 → sqlplus java0514 

 

 dep 테이블 만들기

 create table dep(
 id varchar2(10) primary key
 ,name varchar2(15) not null
 ,location varchar2(50));

 

 

 

 

 

 

  테이블 구조 확인

 > desc dep;

 

 

 

 

 

 

 

 

 

 

   행 추가

 > insert into dep values ('10', '영업부', '서울 강남구');
 > insert into dep values('20', '개발부', '부산 금정구');
 > insert into dep values('30', '회계부', '인천 연수구');

 

  행 개수

 > select count(*) from dep;

 

 

  rollback 

   : 명령어를 한꺼번에 모두 취소 (일부분만 선택하려고 할 때 checkpoint 활용)

 > rollback;

 > select count(*) from dep;

 

 

 

 

 

commit을 하지않고 닫아서 0이 된 모습

  rollback 후에 행 추가하고 count(*)

  : 이 상태에서 commit 처리를 안하고 command 창을 닫아버리면 rollback 상태와 마찬가지로 다 삭제됨

  : commit을 활용하여 거래가 확정되지 않았기 때문

 

 

 

 

 

 

 

 

 commit 을 통해 확정 짓기 (Commit complete)

 

 

 새로 행을 추가하면서 중간에 savepoint a; 를 설정 : savepoint a 이후로 rollback

 

 

[커밋한 자료 복구방법] 

 예쁘게 출력

 col name for a20;

 col type for a10;

 col value for a10;

 show parameter undo;

 

 

[udo_retention]

 - delete, update 후에 커밋을 했을 경우 속성값의 시간(초)까지는 오라클에서 임시로 저장한 데이터로 복구할 수 있음

 - default 속성값은 900초 (15분)

 - 시간을 1500초 (25초)으로 늘리려면 alter system set undo_retention=1500;

 

 

 undo_retention 기능을 이용한 데이터 복구방법

 

 15분 이내에 dep 테이블에서 커밋된 데이터 출력

 select * from dep

 as of timestamp(systimestamp-interval '15' minute);

 

 

 삭제하고 커밋한지 15분안의 데이터 다시 입력

 delete from dep;                                                                   -- 삭제

 commit;                                                                               -- 커밋

 insert into dep select * from dep 

               as of timestamp(systimestamp-interval '15' minute);         -- 15분안에 데이터 다시 입력

Comments