Programming

🔐MSSQL에서 테이블 잠금(Lock)과 Deadlock 처리법 총정리

quantoasis 2025. 3. 23. 14:45
반응형

MSSQL을 사용하다 보면 잠금(Lock)이나 데드락(Deadlock) 에러 메시지를 만나게 됩니다.
"왜 내 쿼리가 멈췄지?" "다른 세션이 잡고 있어서 대기 중입니다?" 이런 경험 다들 한 번쯤 있으시죠?

이번 포스팅에서는 MSSQL에서 잠금이 발생하는 이유, Deadlock을 예방하고 해결하는 방법까지 쉽게 설명해보겠습니다. ✅


🔍 1. Lock(잠금)이란?

잠금은 여러 사용자가 동시에 데이터를 읽거나 쓸 때 데이터의 일관성을 보장하기 위한 메커니즘입니다.

📌 주요 Lock 종류

Lock 종류 설명
Shared Lock (S) 데이터를 읽을 때 부여. 다른 Shared는 허용되지만 Exclusive는 막음
Exclusive Lock (X) 데이터를 수정할 때 부여. 다른 어떤 Lock도 허용되지 않음
Update Lock (U) 업데이트 중 충돌 방지를 위해 임시로 부여
Intent Lock (IS, IX 등) 테이블 수준에서 하위 객체(행, 페이지)에 Lock 걸릴 것임을 알림

💥 2. Deadlock이란?

Deadlock(교착 상태)은 두 개 이상의 세션이 서로가 가진 Lock을 기다리며 무한 대기에 빠지는 상태입니다.

🔁 Deadlock 예시

-- 세션 1
BEGIN TRAN;
UPDATE Products SET Price = Price + 10 WHERE Id = 1;

-- 세션 2
BEGIN TRAN;
UPDATE Products SET Price = Price + 5 WHERE Id = 2;

-- 세션 1이 아래 실행 시 대기 상태
UPDATE Products SET Price = Price + 10 WHERE Id = 2;

-- 세션 2도 아래 실행 시 교착 상태 발생
UPDATE Products SET Price = Price + 5 WHERE Id = 1;

💣 서로 상대방이 보유한 행에 접근하려고 하면서 Deadlock 발생!


🧠 3. Deadlock 해결 방법

✅ 1) 트랜잭션은 짧고 빠르게

  • 가능하면 작은 단위의 작업으로 나누기
  • UI나 사용자 입력 대기 중에는 트랜잭션 열어두지 말 것

✅ 2) 테이블 접근 순서 통일

  • 여러 테이블을 동시에 수정해야 한다면 항상 동일한 순서로 접근하세요.

✅ 3) 인덱스 최적화

  • 불필요한 테이블 스캔이 잠금을 확장시킬 수 있습니다.
  • WHERE 조건절에 적절한 인덱스를 걸면 잠금 범위를 줄일 수 있어요.

✅ 4) SET DEADLOCK_PRIORITY 설정

  • 우선순위를 낮춰 해당 세션이 Deadlock 시 자동으로 희생되게 할 수 있습니다.
SET DEADLOCK_PRIORITY LOW;

🔍 4. 현재 잠금 상태 확인하기

📊 어떤 세션이 어떤 리소스를 잠궜는지 확인

SELECT
    request_session_id AS SessionID,
    resource_type,
    resource_description,
    request_mode,
    request_status
FROM sys.dm_tran_locks
WHERE resource_database_id = DB_ID();

🔄 실행 중인 트랜잭션 확인

SELECT * FROM sys.dm_tran_active_transactions;

🚫 Deadlock 발생 로그 확인 방법

MSSQL 서버에서는 Deadlock이 발생하면 자동으로 해당 상황을 로그에 기록합니다.

📁 SSMS에서 확인하는 방법:

  1. SQL Server Logs > Current 선택
  2. "deadlock" 키워드로 검색

또는 아래 명령어로 트레이스 플래그를 사용해서 Deadlock 정보를 수집할 수도 있습니다.

-- Deadlock 상세 로그 기록 설정 (서버 재시작 필요 없음)
DBCC TRACEON (1222, -1);

🛠 WITH (NOLOCK) 옵션은 안전할까?

WITH (NOLOCK) 옵션은 공유 잠금을 무시하고 Dirty Read 허용합니다.

SELECT * FROM Orders WITH (NOLOCK);

✅ 장점

  • 대기 시간 줄어듬 (빠른 조회)

⚠️ 단점

  • 커밋되지 않은 데이터를 읽을 수 있음 → 데이터 정합성 문제 발생

👉 보고서나 조회용 쿼리에서만 한정적으로 사용하세요!


✅ 마무리 요약

구분 설명
Lock 데이터 충돌을 방지하기 위한 보호 장치
Deadlock 서로 상대방의 리소스를 기다리며 멈춘 상태
예방법 트랜잭션 최소화, 접근 순서 통일, 인덱스 최적화 등
진단법 sys.dm_tran_locks, Deadlock 로그 조회
NOLOCK 조회 전용일 때만 제한적으로 사용 권장

🚨 Deadlock은 성능 저하뿐 아니라 서비스 중단까지 일으킬 수 있으니, 미리 방지하고 빠르게 진단하는 습관이 중요합니다!


반응형