안녕하세요.
프로그램 개발자 입니다.
Mssql 2008R2 를 사용중입니다.
서버와 클라이언트가 다이렉트로 접속합니다. (Client 대략 60대 )
10년 이상 데이타가 쌓여서 인지, 어느시점부터 락이 걸리는 현상이 발생합니다.
현재 insert, upate 시 DB 전체 락을 걸고 작업합니다.
대용량이 아니라 row가 10개 미만이 대부분입니다.
질문
1) select 로 인해 insert, upate 가 안될수 있나요.? 현재는 select 시 락을 걸지 않습니다.
2) DB전체 락이 아닌 테이블 혹은 row 단위로 락을 거는 방법에 대해 여쭈어 봅니다.
3) 락이 어디에서 걸린건지 추적할려면 어떻게 해야 하는건지 문의 드립니다.
개발언어는 Pascal, C# 입니다.
새해 건승을 기원합니다.
감사합니다.
1. sql server 기본 isolation level이 read committed 입니다.
session 에서 isolation level을 read uncommitted로 변경하셨거나 table 에 with(nolock) 혹은 with(readuncommitted) 옵션을 주지 않으셨다면 S-LOCK이 발생할 수 있습니다.
2. db를 변경하지 않는 이상 db 전체를 사용 못하는 lock은 발생하지 않습니다. 다른 문제가 있는지 확인해 보시는게 좋을것 같습니다.
기본적인 lock의 단위는 row이지만 table전체에 lock이 걸리는 경우도 있습니다.
여러가지 경우가 있으나 보통 escalation으로 table lock이 발생하는 경우가 있습니다.
이는 옵션 혹은 쿼리(transaciton 건수) 변경으로 조정이 가능합니다.
3.sys.dm_tran_locks dmv를 조회하셔서 확인이 가능합니다.
sys.dm_exec_requests dmv를 조회하셔서 현재 실행중인 세션에 대한 wait 정보도 확인이 가능하며
sys.dm_os_wait_stats dmv를 조회하셔서 누적된 wait type에 대한 정보도 확인이 가능 합니다.
https://docs.microsoft.com/ko-kr/sql/relational-databases/sql-server-transaction-locking-and-row-versioning-guide
https://docs.microsoft.com/ko-kr/sql/relational-databases/system-dynamic-management-views/sys-dm-tran-locks-transact-sql
https://docs.microsoft.com/ko-kr/sql/relational-databases/system-dynamic-management-views/sys-dm-exec-requests-transact-sql
https://docs.microsoft.com/ko-kr/sql/relational-databases/system-dynamic-management-views/sys-dm-os-wait-stats-transact-sql