본문 바로가기

공부/SQL 활용

7월30일 - SQL 활용 8 : 트랜잭션

트랜잭션 Transaction

 

1. 트랜잭션? 

   - 동시에 다수의 작업을 독립적으로 안전하게 처리하기 위한 상호 작용 단위
   - 일 처리 단위
   - 분할할 수 없는 최소단위
   - 목적 : 안전한 거래 보장

 

2. TCL 명령어 (Transaction Control Language) 

   - commit     : 거래 내역을 확정함
   - rollback   : 거래 내역을 취소함
   - checkpoint : rollback할 위치를 지정함

3. 트랜잭션 특징 

특성 내용 비고
원자성 (Atomicity) 트랜잭션 안에 정의된 연산은 모두 실행되거나 모두 실행되지 않아야 함. All or Nothing
일관성 (Consistency) 트랜잭션 실행 전과 후 동일하게 오류가 없어야 함.

무결성

고립성 (Isolation) 트랜잭션 실행 중 다른 트랜잭션에 영향을 받지 않아야 함. 무결성
지속성 (Durability) 트랜잭션 결과는 항상 보존됨. 장애 대응성

 

4. 트랜잭션 실습하기 

   * sqlplus에서 테스트 
시작->명령프롬프트 cmd
>sqlpus java0514/1234

 

1) 테이블 생성

 

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

 

2) 테이블 구조 확인

 

desc dep;

 

3) 행 추가

 

insert into dep values('10','영업부','서울 강남구');
insert into dep values('20','개발부','부산 동래구');
insert into dep values('30','회계부','인천 계양구');

 

4) 행 갯수 

 

select count(*) from dep;

 

5) 명령어 한꺼번에 모두 다 취소 

    -> rollback;

    -> dep테이블의 칼럼이 다 지워진것을 볼 수 있다.

    -> sqlplus에서 그냥 창닫기(exit)를 할 경우 자동으로 rollback되므로 주의할 것!

 

6) 명령어 완료 및 확정

    -> commit;

 

7) 롤백시점 지정

    -> checkpoint;

    -> savepoint 로 저장할 시점을 지정하고 rollback to 로 롤백시킨다.

    -> 밑의 예제로 말하자면 savepoint를 지정하고 'rollback to a'를 한다면 a까지의 칼럼만 저장하고 밑의 '50,'60'의 데          이터는 날라간다. 는 뜻 

insert into dep values('40','영업부','서울 종로구');
savepoint a;  -- 롤백지점

insert into dep values('50','개발부','서울 중구');
savepoint b; -- 롤백지점

insert into dep values('60','관리부','서울 마포구');

rollback to a;  -- 롤백 a 시점 이후 모두 다 취소 

rollback to 전
rollback to 후 

 

8) commit한 자료의 복구방법

    -1) 예쁘게 출력 

SQL>col name for a20;

SQL>col type for a10;

SQL>col value for a10;

 

SQL>show parameter undo;

 

    -2) undo_retention

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

          복구할 수 있음.

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

      -> 시간을 1500초(25분)으로 늘리려면,

           -> alter system set undo_retention=1500;  

 

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

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

      -> 15분동안 무슨 작업했는지 불러오는 명령문 (일시적이고, 실시간)

 

select * from dep 
as of timestamp(systimestamp-interval '15' minute);

      -> 커밋 데이터 확인 : 아직 15분 전이라 나온다. 

delete from dep; --행 모두 삭제

commit;            --완료

select * from dep  
as of timestamp(systimestamp-interval '15' minute);  --커밋데이터 확인

커밋 데이터 확인

 

    -5)  삭제하고 커밋한지 15분안의 데이터를 복구

 

insert into dep select * from dep as of timestamp(systimestamp-interval '15' minute);
commit;
select count(*) from dep;