isolation Levels 설명
Read Concurrency : Four isolation Levels
원본출처 : 딧세님홈페이지 (http://informix.we.ro/)
- Dirty Read
. No lock check (∴ dirty data일 수 있다)
. No lock (∴ data가 변할 수 있다)
- Committed Read
. Lock check (∴ 적어도 commit data)
. No lock
- Cursor Stability
. Lock check
. Row lock (cursor가 읽고있는 data)
. cursor를 사용하지 않으면 Committed read와 같다.
- Repeatable Read
. 질의에 만족하는 모든 row를 lock
- Setting the Level of isolation
. SET ISOLATION TO [dirty read, committed read, cursor stability,
repeatable read]
. logging mode가 아닌 경우는 Dirty Read고 바꿀 수 없다
. session이 살아있는 동안 유지된다.
- TEST
. 전체 환경 :
CREATE TABLE customer (num serial,
name char(10));
data : 18개
row size : 134byte (index 2개) 즉, 7개의 data의 크기 1024byte
14개의 data의 크기 2048byte
page size : 2048byte
. LOCK MODE ROW
① User1 : DECLARE cur_name CURSOR FOR select * from customer
where num < 118
OPEN CURSOR cur_name
WHILE TRUE
FETCH cur_name into p_variable
IF STATUS = NOTFOUND THEN EXIT WHILE END IF
END WHILE
User2 : update customer
set fname = “data_value”
where customer_num = “key_value”
- SET ISOLATION TO repeatable read, cursor stability, committed read 에 관계 없이 lock을 걸지 않고 모든 DATA 수정 가능
② User1 : DECLARE cur_name CURSOR FOR select * from customer
where num < 118
BEGIN WORK
OPEN CURSOR cur_name
WHILE TRUE
FETCH cur_name into p_variable
IF STATUS = NOTFOUND THEN EXIT WHILE END IF
END WHILE
COMMIT WORK
User2 : update customer
set fname = “data_value”
where customer_num = “key_value”
- COMMITED READ : LOCK이 걸리지 않기 때문에 모든 DATA 수정 가능
- CURSOR STABILITY : 현행 DATA만 LOCK이 걸림.
즉 104번의 DATA를 FETCH 하였을 때 103번 105번 DATA 수정 가능
- REPEATABLE READ : 현행 DATA PAGE에 1024BYTE 만큼의 LOCK이 걸려있음.
즉 103번의 DATA를 FETCH 하였을 때 101-107번 까지는 수정 불가
108번 이후는 수정 가능
또한 108번의 DATA를 FETCH 하였을 때 이전의 DATA는 LOCK이 유지됨.
③ User1 : DECLARE cur_name CURSOR FOR select * from customer
where num < 118 FOR UPDATE
BEGIN WORK
OPEN CURSOR cur_name
WHILE TRUE
FETCH cur_name into p_variable
IF STATUS = NOTFOUND THEN EXIT WHILE END IF
END WHILE
COMMIT WORK
User2 : update customer
set fname = “data_value”
where customer_num = “key_value”
- COMMITED READ : 현행 RECORD
- CURSOR STABILITY : 현행 RECORD
즉 이전 이후의 RECORD의 DATA를 다른 사용자가 수정 가능
- REPEATABLE READ : 현재 읽은 DATA RECORD와 이전에 읽었던 RECORD에 대해
서 LOCK 유지
. LOCK MODE ROW
① User1 : DECLARE cur_name CURSOR FOR select * from customer
where num < 118
OPEN CURSOR cur_name
WHILE TRUE
FETCH cur_name into p_variable
IF STATUS = NOTFOUND THEN EXIT WHILE END IF
END WHILE
User2 : update customer
set fname = “data_value”
where customer_num = “key_value”
- SET ISOLATION TO repeatable read, cursor stability, committed read 에 관계 없이 lock을 걸지 않고 모든 DATA 수정 가능
② User1 : DECLARE cur_name CURSOR FOR select * from customer
where num < 118
BEGIN WORK
OPEN CURSOR cur_name
WHILE TRUE
FETCH cur_name into p_variable
IF STATUS = NOTFOUND THEN EXIT WHILE END IF
END WHILE
COMMIT WORK
User2 : update customer
set fname = “data_value”
where customer_num = “key_value”
- COMMITED READ : LOCK이 걸리지 않기 때문에 모든 DATA 수정 가능
- CURSOR STABILITY : 현행 DATA가 있는 PAGE에 LOCK이 걸림.
즉 104번의 DATA를 FETCH 하였을 때 103번 105번 114번 115번 DATA 수정 가능
즉 115번 DATA RECORD를 FETCH 하였을 때 101 – 114번 까지의 DATA 수정 가능
물리적으로 한 PAGE는 14개의 DATA를 포함
- REPEATABLE READ : 현행 DATA의 PAGE에 대해 LOCK이 걸려있음.
즉 103번의 DATA를 FETCH 하였을 때 101-114번 까지는 수정 불가
115번 이후는 수정 가능
또한 108번의 DATA를 FETCH 하였을 때 이전의 DATA는 LOCK이 유지됨.
③ User1 : DECLARE cur_name CURSOR FOR select * from customer
where num < 118 FOR UPDATE
BEGIN WORK
OPEN CURSOR cur_name
WHILE TRUE
FETCH cur_name into p_variable
IF STATUS = NOTFOUND THEN EXIT WHILE END IF
END WHILE
COMMIT WORK
User2 : update customer
set fname = “data_value”
where customer_num = “key_value”
- COMMITED READ : 현행 PAGE
- CURSOR STABILITY : 현행 PAGE
즉 이전 이후의 RECORD의 DATA를 다른 사용자가 수정 가능
- REPEATABLE READ : 현재 읽은 DATA RECORD와 이전에 읽었던 RECORD PAGE
에 대해서 LOCK 유지
|