https://www.youtube.com/watch?v=vCMksYnoeyI&t=763s
C:\oracle
로그인
sqlplus id/pw
Oracle Transaction Level Test;
기본 Default는 read committed이기 때문에 query수준의 read consistency 보장, transaction 수준은 보장 X
ex)
trans1 | trans2 |
---|---|
select * from top | |
select * from top | |
update top set id=1 where id =3 | |
select * from top |
trans2의 select 결과는 변하지 않는다(commit이 되지 않았기 때문에)
trans1 | trans2 |
---|---|
select * from top | |
select * from top | |
update top set id=1 where id =3 commit; | |
select * from top |
하게되면 trans2의 select결과가 달라지게 된다 ( non-repeatable read 발생)
이러한 non-repeatable read와 pantom read를 제거하기 위해서는 격리 단계를 높여주어야 한다.
set transaction isolation level serializable;
격리단계를 3단계로 높여주면 select되어있는 범위내의 값에 lock을 걸기 때문에 다른 transaction에서 insert update delete가 불가능하다. 따라서 non-repeatable read나 pantom read 방지가 가능하지만, lock으로 인한 동시성 저하가 발생한다.
하지만 오라클은 MVCC를 통해 transaction-level에서 snapshot을 걸어서 SCN(System Change Number로서, Database의 commit된 version을 나타내는 database 구조)을 통해 항상 transaction의 시작지점을 바라볼 수 있기 때문에 따로 lock을 걸지 않아도 된다. 따라서 동시성을 확보할 수 있다. 하지만 undo log file의 값이 커지는 것을 방지해야 한다.