본문 바로가기

카테고리 없음

10. 트랜잭션 (Transaction)

■ 트랜잭션
 ※ 트랜잭션(Transaction)
   ο COMMIT 과 ROLLBACK

SELECT  * FROM tab;
SELECT  * FROM seq;
    
 CREATE TABLE test1(
    num NUMBER PRIMARY KEY,
    name VARCHAR2(50) NOT NULL ); 
    
 CREATE SEQUENCE test1_seq
 START WITH 1
 INCREMENT BY 1
 NOMAXVALUE
 NOCYCLE
 NOCACHE;
 

  SELECT  * FROM tab;
SELECT  * FROM seq;
    
    INSERT INTO test1(num, name) VALUES ( test1_seq.NEXTVAL, 'a');   
    INSERT INTO test1(num, name) VALUES ( test1_seq.NEXTVAL, 'b');
    
    SAVE POINT a;
    INSERT INTO test1(num, name) VALUES ( test1_seq.NEXTVAL, 'c');
    
    SELECT * FROM test1;
    
    ROLLBACK TO a;  -- 마지막 입력한 것만 롤백 
    
    SELECT * FROM test1;

    COMMIT; 
    SELECT * FROM test1;

    ROLLBACK; -- COMMIT후 롤백은 의미 없음
    SELECT * FROM test1;  




   ο 트랜잭션 관련 설정
     1) SET TRANSACTION : 다양한 트랜잭션 속성을 지정

-- VS Code
   SET TRANSACTION READ ONLY;
-- SELECT 만 가능 (INSERT, UPDATE, DELETE 불가)

   DELETE FROM test1; 
-- 에러

   SET TRANSACTION READ WRITE;

   DELETE FROM test1; 
   SELECT * FROM test1;

   ROLLBACK;

     2) LOCK TABLE
        : 현재 트랜잭션이 진행되고 있는 데이터에 대해 다른 다른 트랜잭션의 검색이나 변경을 막아 여러 트랜잭션이 동시에 같은 데이터를 사용하도록 설정


-- SQL Developer에서만 실행

LOCK TABLE test1 IN EXCLUSIVE MODE;
-- EXCLUSIVE : 잠긴 테이블에 SELECT 만 가능



INSERT INTO test1(NUM, name) VALUES (test1_seq.NEXTVAL, 'rr');
SELECT * FROM test1;

-- VS Code

DELETE FROM test1; -- 대기

SELECT * FROM test1;

-- SQL Developer
ROLLBACK;

-- VS Code
SELECT * FROM test1;
ROLLBACK;


-- SQL Developer
DROP TABLE test1 PURGE;
DROP SEQUENCE test1_seq;





   ο COMMIT이 되지 않는 상태 확인
      -------------------------------------------------------
      -- 관리자(sys 또는 system) 계정에서 확인
        SELECT s.inst_id inst, s.sid||','||s.serial# sid, s.username,
                    s.program, s.status, s.machine, s.service_name,
                    '_SYSSMU'||t.xidusn||'$' rollname, --r.name rollname, 
                    t.used_ublk, 
                   ROUND(t.used_ublk * 8192 / 1024 / 1024, 2) used_bytes,
                   s.prev_sql_id, s.sql_id
        FROM gv$session s,
                  --v$rollname r,
                  gv$transaction t
        WHERE s.saddr = t.ses_addr
        ORDER BY used_ublk, machine;