데이터베이스 개발자 질문과 답변 게시판
운영중인 DB서버 SP내 에러로그가 아내와 같이 찍혀
데드락 추적 로그를 확인해 보니 첨부파일과 같았습니다...
2059 1205 13 52 usp_NPostReadList 22 트랜잭션(프로세스 ID 53)이 잠금 | 통신 버퍼 리소스에서 다른 프로세스와의 교착 상태가 발생하여 실행이 중지되었습니다. 트랜잭션을 다시 실행하십시오.
첨부파일 로그를 보면 SP usp_NPostReadList 내 아래 쿼리가 각각 다른 세션에서 실행되다가 UPDATE LOCK이 걸린것 같은데
UPDATE dbo.tbl_Post SET bUse = 1 WHERE dw64CharObjectId = @dw64CharObjectId AND bUse = 2 AND dtCreateTime < getdate() - '1900-01-01 00:30:00'....
다행히 X락이 아니어서 작업관리자에 LATCH~ 어쩌구 해당 세션에 뜨더니 그냥 지나가더군요...
현재 LOCK TIME_OUT 5000; 옵션만 주긴 했는데.... 해당 쿼리 UPDATE시 TBL_POST테이블에 WITH(ROWLOCK, XLOCK)같은...
힌트를 줘야되나요?;;
Comment 9
-
minsouk
2013.02.12 14:36
-
몽블랑
2013.02.12 21:19
데드락 그래프는 아직 못떠봤구요.ㅠㅠ...첨부파일에 1222 1204로그는 있습니다....
데드락 발생을 찾기만 했지 해결방법은 아직 너무 부족한거 같아요..ㅠㅠ;
-
minsouk
2013.02.12 21:30
음 deadlock 난 로그를 다 올리시는게 좋을듯 합니다.
deadlock 을 풀기위해 deadlock 이후 꼬인 부분을 rollback 하면서 일어난 로그도 모두 찍혀 있는것 같습니다.
deadlock 난 즉, 풀지 못하는 resource chain 부분을 올려주세요~
-
몽블랑
2013.02.12 22:02
로그는 첨부한 파일 시간때 로그가 전부입니다..... 임시로 해당 SP에 LOCKTIME OUT 옵션을 걸었더니 아직까진 별문제 없이 돌아가네요.
이전에 서버가 죽었을때는 TRACE를 안걸어놔서 해당 시간로그는 없습니다....ㅠㅠ;; 하지만 저 SP내 쿼리가 호출될때 문제가 발생됬다는것만 확인했네요.
-
minsouk
2013.02.12 23:16
음 나중에 한번 볼께요 ㅡ.ㅡ -
minsouk
2013.02.14 14:28
[원인]
모두 같은 쿼리로 deadlock
인덱스가 없어(?)서 병렬처리로 update 추정 (ecid 0 보다 큰것과 exchangeEvent 발생)
[액션]
1. locktimeout 설정
2. 인덱스 생성
create nonclustered index nc_tbl_post_01 on tbl_post (w64CharObjectId , bUse , dtCreateTime )
U 락은 nonclustered index 를 이용해 clustered index 에 접근할때 실제 X 락을 걸기전 까지의 lock 입니다.
-
몽블랑
2013.02.14 21:03
지난번 도움을 주신것외 매번 좋은답변 감사드립니다..ㅜㅜ
UPDATE시 발생하는 UPDLOCK -> XLOCK락과정을 다시한번 숙지하게 되네요.
답변주신 처리하는 과정 로그보면서 다시 정리해보도록 하겠습니다...^^
-
minsouk
2013.02.15 01:58
http://cafe.naver.com/sqlmvp/3689
심심하시면.............오!세!욤!
-
몽블랑
2013.02.15 21:28
댓글 달았습니다. 내일 참석하겠습니다. ^^
deadlock graph 를 떠 주세요~ 그리고 tf 1222 1204 결과도 주시면 avoid 하는 방법을 찾을 수 있습니다.