데이터베이스

동시성 제어_ 트랜잭션 격리 수준(isolation Level) 고립단계_갱신 분실 Lost Update, 부정판독 Dirty Read, 비반복판독 Non-Reatable Read, 가상 판독 Phantom Reads, 연쇄 복귀, 모순성 , 독립성 레벨, 병행수행도, ..

스윙스윙 2021. 8. 13. 21:17

▣ 동시성 제어_ 트랜잭션 격리 수준(isolation Level) 고립단계_갱신 분실 Lost Update, 부정판독 Dirty Read, 비반복판독 Non-Reatable Read, 가상 판독 Phantom Reads, 연쇄 복귀, 모순성 , 독립성 레벨, 병행수행도, 고립성

독립성 레벨
isolation Level
부정 판독
(Dirty Read)
비반복 판독
(Non-Reatable Read)
팬텀
(Phantom Read)
비고
L0. Read Uncommitted O O O shared lock(X)
아직 Commit되지 않은 데이터를 다른 트랜잭션에서 읽는 것 허용
L1. Read Committed X O O shared lock(O)
트랜잭션에서 commit되어 확정된 데이터만 다른 트랜잭션이 읽도록 허용함
L2. Repeatable Read X X O read동안 update/delete(X)
트랜잭션 내에서 쿼리를 두번 이상 수행할 때, 첫번째 쿼리에 있던 레코드가 사라지거나 값이 바뀌는 현상을 방지해 줌
트랜잭션 완료시까지 shared lock을 유지
L3. Serializable Read X X X read동안 insert(X)
트랜잭션 내에서 쿼리를 두번 이상 수행할 때, 첫번째 쿼리에 있던 레코드가 사라지거나 값이 바뀌지 않음은 물론 새로운 레코드 삽입도 방지
완벽한 데이터베이스 일관성 유지

독립성 레벨이 높을수록 간섭의 정도는 낮음(병행수행도 낮아짐)

 

Serializable < Repeatable < Read Committed < Read Uncommitted

높은 고립 수준(낮은 동시성) ↔ 낮은 고립 수준(높은 동시성)

 

* 암기키워드

Lost Update -> L.U 덮어쓰기 엎친데 덮친격(write 두번)

Dirty Read -> D.R Rollback

Non-Repeatable Read -> N.R 집계 U. D.

Phantom Read -> P.R 집계 I

 

▣ 병행 제어를 하지 않을 때의 문제점

- 갱신 손실(Lost Update) : 두 개 이상의 트랜잭션이 같은 자료를 공유하여 갱신할 때 갱신 결과의 일부가 없어지는 현상

- 비완료 의존성(Uncommitted Dependency) : 하나의 트랜잭션 수행이 실패한 후 회복되기 전에 다른 트랜잭션이 실패한 갱신 결과를 참조하는 현상. 임시 갱신이라고도 한다.

- 모순성(Inconsistency) : 두 개의 트랜잭션이 병행수행될 때 원치 않는 자료를 이용함으로써 발생하는 문제. 불일치 분석이라고도 한다.

- 연쇄 복귀(Cascading Rollback) : 병행수행되던 트랜잭션들 중 어느 하나에 문제가 생겨 Rollback하는 경우 다른 트랜잭션도 함께 Rollback되는 현상

 

* 연쇄복귀(cascading rollback)는 부정판독(dirty read)과 유사함

부정판독은 완료되지 않은 데이터를 읽는 그 자체의 문제점을 의미하며,

연쇄복귀는 다른 트랜잭션의 취소(rollback)때문에 자신도 취소할 것인지 말 것인지에 대한 문제

 

* 모순성(inconsistency) : 트랜잭션 수행 시 값이 달라지는 모순성

두 트랜잭션이 인터리빙 되어 병행 수행될 때 원치 않는 자료를 이용함으로써 발생하는 현상

 


2014년 66번

정답 : 1번, 3번

동일한 트랜잭션에서 동일한 데이터를 조회할 경우, 같은 값이 나오기 위해서는 'REPEATABLE READ'가 보장되어야 함.

비반복적 읽기(Non-Repeatable Reads) 오류가 발생하지 않아야 함.

독립성 레벨
isolation Level
부정 판독
(Dirty Read)
비반복 판독
(Non-Reatable Read)
팬텀
(Phantom Read)
L0. Read Uncommitted O O O
L1. Read Committed X O O
L2. Repeatable Read X X O
L3. Serializable Read X X X

 

 


2013년 69번

정답 : 1번, 4번

독립성 레벨
isolation Level
부정 판독
(Dirty Read)
비반복 판독
(Non-Reatable Read)
팬텀
(Phantom Read)
비고
L0. Read Uncommitted O O O shared lock(X)
아직 Commit되지 않은 데이터를 다른 트랜잭션에서 읽는 것 허용
L1. Read Committed X O O shared lock(O)
트랜잭션에서 commit되어 확정된 데이터만 다른 트랜잭션이 읽도록 허용함
L2. Repeatable Read X X O read동안 update/delete(X)
트랜잭션 내에서 쿼리를 두번 이상 수행할 때, 첫번째 쿼리에 있던 레코드가 사라지거나 값이 바뀌는 현상을 방지해 줌
트랜잭션 완료시까지 shared lock을 유지
L3. Serializable Read X X X read동안 insert(X)
트랜잭션 내에서 쿼리를 두번 이상 수행할 때, 첫번째 쿼리에 있던 레코드가 사라지거나 값이 바뀌지 않음은 물론 새로운 레코드 삽입도 방지
완벽한 데이터베이스 일관성 유지

2011년 74번

정답 : 3번

 


2014년 69번

정답 : 1번

T2 데이터 조회 이후, T1의 Rollback이 진행되었으므로 '오손 데이터 읽기' 오류 발생함


2011년 69번

정답 : 1번


트랜잭션 T1에서 write(x) 수행한 값을 트랜잭션 T2에서 read(x)로 읽어서 사용하고 있으나,
‘00:00:07’에 T1 작업이 실패했으므로 write(x) 수행한 연산은 롤백(Rollback) 됨

다른 트랜잭션에서 철회 대상인 쓰기 연산 값을 트랜잭션 T2에서 사용했으므로 

오손 읽기(Dirty Read) 문제가 발생


1) 트랜잭션 T1에서 수행하는 sum(price) 연산은 T2에서 이미 읽기/쓰기 연산이 실행된 상태

하지만, 트랜잭션 T1에서 독립성 레벨을 ‘Repeatable Read’로 설정하고 있으므로 읽기 연산
을 수행하는 동안 다른 트랜잭션에서 update/delete를 수행할 수 없음

T2에서 연산이 수행되기 전 값인 10,000을 읽어와서 비반복 판독(Non-Repeatable Read)을 방지


2) 트랜잭션 T2에서 수행하는 sum(price) 연산은 T1에서 조회 연산만 실행하므로, 

T2에서 최종 쓰기 연산을 수행한 price = price+100 값인 10,100 값을 출력함


2017년 63번

선행 트랜잭션인 T1 에서 Write 한 x 값 갱신된 값 이 후행 트랜잭션인 T2 에서 Write(x) 로 인해
갱신 손실이 발생


2018년 67번

정답 : 2번

두 트랜잭션이 인터리빙 되어 병행 수행 될 때 원치 않는 자료를 이용함으로써 발생하는 현상


2018년 68번

정답 : 2번

트랜잭션 독립성 수준이 높을수록 간섭의 정도는 낮습니다. 즉, 병행 수행도가 낮아진다는 의미입니다.

병행 수행도가 낮다는 것은 트랜잭션 처리율도 낮다는 의미임


2019년 55번

정답 : 1번


2020년 59번

정답 : 4번

독립성 레벨
(isolation Level)
부정 판독
(Dirty Read)
비반복 판독
(Non-Reatable Read)
팬텀
(Phantom Read)
비고
L0. Read Uncommitted Y Y Y shared lock(X)
L1. Read Committed N Y Y shared lock(O)
L2. Repeatable Read N N Y read동안 update/delete(X)
L3. Serializable Read N N N read동안 insert(X)

 


 

2021년 64번

정답 : 1번

트랜잭션 T1에서 UPDATE 수행한 값을 트랜잭션 T2에서 읽어서 사용하고 있으나,

T1작업이 마지막에 ROLLBACK되고 있음.

다른 트랜잭션에서 철회 대상인 쓰기 연산 값을 트랜잭션 T2에서 사용했으므로

오손읽기(Dirty Read)문제 발생됨