SET TRANSACTION READ ONLY ;
-- transaction-level 읽기 일관성
-- 트랜잭션 시작 시점의 데이터를 보여준다
SET TRANSACTION READ WRITE ;
-- statement-level 읽기 일관성
-- SQL 실행 시점의 데이터를 보여준다
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE ;
-- 트랜잭션 시작 시점의 읽기 일관성
-- 시작 이후 다른 세션에서 변경한 값을 변경하려고 하면 에러 발생
- SYS 유저로 조회 시 READ ONLY 에서도 최신값을 보여주므로 다른 계정으로 테스트
- SYS 유저는 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 명령시 에러 발생
SET TRANSACTION READ ONLY 테스트
-- 세션 1, transaction read only SQL> show user USER is "SYSTEM" SQL> SET TRANSACTION READ ONLY ; Transaction set. SQL> select count(*) from sk.tab1 ; COUNT(*) ---------- 8715 |
|
-- 세션 2 SQL> select count(*) from sk.tab1 ; COUNT(*) ---------- 8715 SQL> insert into sk.tab1 select * from dba_tables ; 2179 rows created. SQL> select count(*) from sk.tab1 ; COUNT(*) ---------- 10894 SQL> commit ; Commit complete. |
|
-- 세션 1 -- 세션2에서 insert 후 commit 했지만 트랜잭션 시작 시점의 데이터를 보여주므로 값이 변하지않음 SQL> select count(*) from sk.tab1 ; COUNT(*) ---------- 8715 SQL> rollback ; Rollback complete. SQL> select count(*) from sk.tab1 ; COUNT(*) ---------- 10894 |
반응형
SET TRANSACTION READ WRITE 테스트
-- 세션 1, transaction read write SQL> SET TRANSACTION READ WRITE ; Transaction set. SQL> select count(*) from sk.tab1 ; COUNT(*) ---------- 10894 |
|
-- 세션 2, insert SQL> select count(*) from sk.tab1 ; COUNT(*) ---------- 10894 SQL> insert into sk.tab1 select * from dba_tables ; 2179 rows created. SQL> select count(*) from sk.tab1 ; COUNT(*) ---------- 13073 SQL> commit ; Commit complete. |
|
-- 세션 1 -- 세션 1에서 insert 후 commit 한 값이 바로 보임, SQL실행 시점의 읽기 일관성 SQL> select count(*) from sk.tab1 ; COUNT(*) ---------- 13073 SQL> rollback ; Rollback complete. |
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
-- 세션 1, transaction read only SQL> select * from sk.tab2 ; C1 C2 ---------- ---------- 1000 1 SQL> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE ; Transaction set. SQL> select * from sk.tab2 ; C1 C2 ---------- ---------- 1000 1 |
|
-- 세션 2 SQL> select * from sk.tab2 ; C1 C2 ---------- ---------- 1000 1 SQL> update sk.tab2 set c1 = c1 +1000 where c2 = 1; 1 row updated. SQL> select * from sk.tab2 ; C1 C2 ---------- ---------- 2000 1 SQL> commit ; Commit complete. |
|
-- 세션 1 -- serializable 트랜잭션 이후 데이터 변경되엇다며 ORA-08177 에러 발생 SQL> update sk.tab2 set c1 = c1 +500 where c2 = 1; update sk.tab2 set c1 = c1 +500 where c2 = 1 * ERROR at line 1: ORA-08177: can't serialize access for this transaction |
기타
SET TRANSACTION 사용은 v$session.taddr 에는 값이 보이지만 v$transaction 에서는 안보인다
SQL> SELECT sid, taddr, program FROM v$session
WHERE username = 'SYSTEM'
AND TYPE != 'BACKGROUND'
;
SID TADDR PROGRAM
---------- ---------------- ------------------------------------------------
21 sqlplus@svr (TNS V1-V3)
271 00000000692BA070 sqlplus@svr (TNS V1-V3)
SQL> select * from v$transaction ;
no rows selected
'DBMS > ORACLE' 카테고리의 다른 글
[oracle] 세션 비정상 종료 시 commit/rollback 테스트 (0) | 2024.06.27 |
---|---|
[oracle] deadlock 테스트 ORA-00060 (1) | 2024.06.13 |
[oracle] COLD BACKUP 이후 발생한 아카이브 로그 적용 방법 (0) | 2024.05.19 |
[oracle] windows 오라클 설치 시 setup.exe 무반응 해결방법 (0) | 2024.05.07 |
[oracle]alter user ... replace 구문 (ORA-28221) (0) | 2024.04.30 |
댓글