생계/SQL2021. 7. 16. 16:42

트랜잭션 고립 수준에 대해서 알아보 ...기 전에

트랜잭션의 4 가지 속성에 대해서 알아보자

1. 트랜잭션의 ACID 속성

 - 원자성 ( Atomicity )
트랜잭션은 더 이상 쪼개질수 없는 최소한의 작업 단위.
부분적으로 성공하는 일이 없어야 함

 - 일관성 ( Consistency )
트랜잭션이 성공적으로 완료되면 일관적인 DB상태를 유지해야한다

 - 격리성 ( Isolation )
트랜잭션끼리는 서로 영향을 주지 않고 독립적으로 실행되야함

 - 지속성 ( Durability )
커밋된 트랜잭션은 영원히 DB에 반영이 되어야 함

 

이 중 3번째 언급된 Isolation 의 level 에 대해서 정리할 것이다. 

 

2. 트랜잭션 격리 레벨

1) read uncommitted

  => 변경은 되었지만 아직 커밋이 되지 않은 레코드를 읽기 허용 (dirty read)

    완료되지 않은 작업이 롤백이 될 경우, 이를 읽고 있던 세션에서의 작업은 일관성의 문제가 발생

    대부분의 DBMS 는 디폴트로 허용하지 않음

 

2) read committed

  => 커밋이 완료된 레코드만 다른 세션에서 읽기가 허용됨. (oracle은 undo 를 통해 구현. DB2 등은 공유락으로 구현)

      1번 레벨에 비해서 일관성의 문제는 개선되었지만 non-repeatable read 문제 발생 

    * non-repeatable read

        한 트랜잭션 내에서 수행한 같은 쿼리가 중간에 들어온 쿼리 때문에 다른 결과를 리턴

     중간에 들어온 tx2 때문에 tx1 의 결과가 예상과 다른결과가 나오게 된다.   

 

3) repeatable read

      tx1 트랜잭션의  t1 시점의 쿼리에 for update 구문을 적용하면 중간에 들어온 tx2 는 대기를 하게 되고 

     tx1 은 일관성 있는 결과를 리턴하게 된다. 

    그런데 만약 update 가 아닌 중간에 insert 가 들어온다면 이것은 또 일관되지 않은 결과를 리턴하게 될 것이다.  

  * phantom read

  tx1 의 트랜잭션에서 상품의 합계가 t1 시점과 t4 시점이 서로 다른 일관성이 없는 결과를 리턴한다.

 

4) serializable

 중간에 삽입이되는 트랜잭션도 막아버리려면 고립 수준을 더 올려야 한다. 

set transaction isolation level serializable;

이것은 최고수준의 격리이며 일관성은 보장이 되지만 동시성은 상당히 떨어뜨리게 된다. 

 * oracle 은 scn 사용으로 lock 을 안쓰고도 일관성을 보장할수 있다. 

 

트랜잭션의 격리 레벨에 따라 일관성을 해치는 결과가 나올수있음을 인지하고 자신의 처한 환경에 따라 적절하게 대응해야 한다.

반응형
Posted by 돌고래트레이너