with(updlock) 케이스별 테스트

BEGIN TRANSACTION 과 함께 사용하여야 함.

FU_CALCSET
-------------------------------------------------
key_no | name  | status
-------------------------------------------------
1        aaa     1  
2        bbb     1
3        ccc     1
4        ddd     1

----------------------------------------------------------------------
-- case 1 : 세션1 검색결과set의 모든 row에 updlock이 걸린다.
--              다건 vs 단건
----------------------------------------------------------------------
-- 세션1
BEGIN TRANSACTION;
select * from FU_CALCSET with(updlock) where status = '1';
sleep(30);
cursor.update();

-- 세션2-1
select * from FU_CALCSET where key_no = 1;
sleep(5);
cursor.update();
===>
실패 : 세션1의 지연시간동안 세션1 검색결과set의 모든 레코드를 update 할 수 없음.

-- 세션2-2
select * from FU_CALCSET with(updlock) where key_no = 2;
===>
실패 : 세션1의 지연시간동안 lock 걸림.

-- 세션2-3
BEGIN TRANSACTION;
select * from FU_CALCSET with(updlock) where key_no = 3;
===>
실패 : 세션1의 지연시간동안 lock 걸림.

----------------------------------------------------------------------
-- case 2 : BEGIN TRANSCATION 없이 사용한 updlock은 작동안함.
--              다건 vs 단건
----------------------------------------------------------------------
-- 세션1
select * from FU_CALCSET with(updlock) where status = '1';
sleep(30);
cursor.update();

-- 세션2-1
select * from FU_CALCSET where key_no = 1;
sleep(5);
cursor.update();
===> 성공

-- 세션2-2
select * from FU_CALCSET with(updlock) where key_no = 2;
sleep(5);
cursor.update();
===> 성공

-- 세션2-3
BEGIN TRANSACTION;
select * from FU_CALCSET with(updlock) where key_no = 3;
sleep(5);
cursor.update();
COMMIT TRANSACTION;
===> 성공

----------------------------------------------------------------------
-- case 3 : 단건 vs 다건
----------------------------------------------------------------------
-- 세션1
BEGIN TRANSACTION;
select * from FU_CALCSET with(updlock) where key_no = 3;
sleep(25);
cursor.update();

-- 세션2-1
select * from FU_CALCSET where status = '1';
sleep(5);
cursor.update();
===>
실패 : 3번 레코드를 업데이트 할때 세션1의 지연시간만큼 lock걸림

-- 세션2-2
select * from FU_CALCSET with(updlock) where status = '1';
===>
실패 : 세션1의 지연시간동안 lock 걸림.
       3번 레코드의 status가 '1'이기 때문에 검색결과set에 포함된다.

+ Recent posts