안녕하세요.
프로시저 실행 중 종종 테이블에 락이 걸려 진행이 되지 않는 경우가 발생합니다.
아래는 프로시저 부분인데
어떠한 수정을 해야 테이블 락이 없이 진행이 될까요?? 문제는 가끔씩 그런다는건데.. 원인을 알아야 수정을 하고 테스트를 해볼텐데
ㅠㅠ 힌트나 해결법을 좀 알려주시면 감사하겠습니다~그리고 원인도 좀 알려주세요~ 그래야 후에 이러한 상황을 방지할 수 있을 것
같습니다.
SET XACT_ABORT ON;
BEGIN tran test1
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
declare @result int
set @result = 0
SET NOCOUNT ON;
insert into HANON_LOT_PRESS select head_qr , head_date , head_num , head_flow , head_model , hn_date , hn_time , hn_num , hn_model from HANON_PRESS where head_qr = @head_qr
if(@@Error = 0 and @@rowcount > 0)
begin
delete from hanon_press where head_qr = @head_qr
if(@@Error = 0 and @@rowcount > 0)
begin
insert into hanon_lot_test values(@head_qr , @head_date , @head_num , @head_flow , @head_model , @hn_date , @hn_time , @hn_num , @hn_model)
if(@@Error = 0 and @@rowcount > 0)
begin
set @result = 1
select @resultp = @result
commit tran test1
return
end
else
begin
rollback tran test1
end
end
else
begin
rollback tran test1
end
end
else
begin
select @resultp = @result
return
end
commit tran test1
Comment 2
-
처리짱
2017.07.19 11:09
-
핵냥이
2017.07.19 14:46
일반적으로 단일 SQL 구문이 하나의 테이블에 5,000개의 잠금을 획득 할 경우 Lock Escalation 이 발생합니다.
이것이 테이블락 일 수 있고요,
위 쿼리에서 DELETE 구문이 한번에 지울 수 있는 양을 체크해 보세요
자세한 것은 아래의 링크를 참고하시기 바랍니다~
Lock Escalation
https://technet.microsoft.com/en-us/library/ms184286(v=sql.105).aspx
아래 링크 파일처럼 설정을 맞추시고 하루정도 프로파일러를 돌려보세요.
락을 잡는 위치와 락이 잡히는 위치가 정확히 확인이 될거에요.
일반적으로 INSERT DELETE UPDATE를 빨리 끝내고.
SELECT 구문에는 WITH(NOLOCK) 혹은 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 속성을주죠.
상황에 따라 틀리겠지만요..
http://naver.me/GvvbgjTO