트랜잭션 고립 수준에 대해서 알아보 ...기 전에
트랜잭션의 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 을 안쓰고도 일관성을 보장할수 있다.
트랜잭션의 격리 레벨에 따라 일관성을 해치는 결과가 나올수있음을 인지하고 자신의 처한 환경에 따라 적절하게 대응해야 한다.
'생계 > SQL' 카테고리의 다른 글
[oracle]프로시져 out 파라미터 호출하기 (0) | 2022.07.13 |
---|---|
SQL 작성 표준 (0) | 2022.07.11 |
[oracle] 아우터 조인 outer join 제대로 이해하기 (0) | 2020.04.28 |
sql 튜닝 트레이스 (0) | 2019.10.21 |
서브쿼리에 대해서 알아보자 (0) | 2019.06.06 |