본문 바로가기
DBMS/ORACLE

[oracle] TRANSACTION 모드, ISOLATION LEVEL 테스트

by 드바 2024. 5. 29.

 

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

댓글