-- 데드락이 걸린경우, SQL서버가 중재를 해서 하나의 프로세스를 Victim(희생양)으로 처리한다
-- 데드락 확인 방법
exec sp_lock; -- mode가 x인 프로세스가 lock에 걸린 항목이다. spid를 복사해 둔다.
select * from master.dbo.sysprocesses where blocked != 0 and spid != blocked;
-- SQL SERVER 로그에서 데드락 상태확인을 위해 두가지 추적 플래거 사용가능
DBCC TRACEON(1204, -1) -- 어떤 쿼리에서 데드락 발생했는지 확인가능
DBCC TRACEON(1222, -1) -- 좀 더 상세한 정보 어떤 구문에서 발생했는지 확인가능
-- 클라이언트에서 MSSQL로 보낸 최종 명령문 표시
dbcc inputbuffer( spid);
--성능 모니터에 SQLServer:Locks의 Number of Deadlocks/sec 카운터를 추가하여 모니터링
-- 관련정보 표시
exec sp_who spid;
exec sp_who2 spid;
-- 프로세스 죽이기
kill spid;
-- 데드락 해결 방법
-- 락 타임아웃 설정 (초기값은 -1)
-- 10초 지나면 취소되게 한다
SET LOCK_TIMEOUT 10000
-- 락 타임아웃 확인
SELECT @@LOCK_TIMEOUT
-- SELECT 할때 WITH (NOLOCK) 혹은 WITH (READUNCOMMITTED) 사용하여
-- LOCK를 무시하고 데이터를 조회홤. (LOCK걸린 행도 보여짐)
-- 과거데이터를 조회할 경우 WITH (READPAST) 를 사용하여 LOCK걸린 행을 제외하고 데이터를 조회함.
SELECT * FROM TABLE1 WITH (NOLOCK);
SELECT * FROM TABLE1 WITH (READUNCOMMITTED);
SELECT * FROM TABLE1 WITH (READPAST);
'MSSQL' 카테고리의 다른 글
[MSSQL] 문자열 구분자로 쪼개기/나누기 (split) (0) | 2016.07.04 |
---|---|
[MSSQL] 현재 접속중인 세션정보 / 아이피 확인방법 (0) | 2016.07.03 |
[MSSQL] 컬럼명(필드명)에 특정 문자열 포함하는 테이블 찾기 (0) | 2016.07.03 |
[MSSQL] TRY / CATCH 사용방법 (0) | 2016.07.03 |
[MSSQL] TRANSACTION(트랜잭션) / COMMIT(커밋) / ROLLBACK(롤백) (0) | 2016.07.02 |