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에 포함된다.
'MSSQL' 카테고리의 다른 글
OUTPUT : inset, update 시 적용된 칼럼값 구하기 (0) | 2012.09.10 |
---|---|
로그파일 축소 (0) | 2012.07.22 |
MSSQL identity 테스트 (0) | 2012.01.20 |
(펌) MSSQL Identity 자동 증가함수 (0) | 2012.01.20 |
(펌) T_SQL 같은 그룹의 데이터를 붙여서 출력하기 (0) | 2011.12.27 |