■ 트랜잭션
※ 트랜잭션(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;
카테고리 없음