반응형
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에서 확인하는 방법:
- SQL Server Logs > Current 선택
- "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은 성능 저하뿐 아니라 서비스 중단까지 일으킬 수 있으니, 미리 방지하고 빠르게 진단하는 습관이 중요합니다!
반응형
'Programming' 카테고리의 다른 글
🗂 Python으로 CSV → MSSQL 대량 업로드 (속도 비교 포함) (0) | 2025.03.24 |
---|---|
🗂 Python에서 리스트 ↔ 문자열 변환 방법 총정리 (join, split 완전 이해하기) (1) | 2025.03.23 |
🔁 Python으로 MSSQL 반복 쿼리 실행 및 자동화 방법 (0) | 2025.03.22 |
📤 MERGE 문으로 MSSQL에서 UPSERT 처리하는 방법 완벽 정리 (0) | 2025.03.22 |
🚀 MSSQL에서 레코드 가져오기 (TOP, OFFSET, LEAD 등) 완벽 정리 (0) | 2025.03.21 |