복붙노트

[SQL] 테이블에 개최되는 잠금 확인하는 방법

SQL

테이블에 개최되는 잠금 확인하는 방법

우리는 어떻게 쿼리 일괄 처리에 대한 행을에 적용되는 데이터베이스 잠금 확인할 수 있습니까?

하이라이트 테이블 행 수준을 실시간으로 잠금 것을 모든 도구?

DB : 2005 SQL 서버

해결법

  1. ==============================

    1.다른 응답에 추가하려면,는 sp_lock는 실행중인 모든 프로세스에 대한 전체 잠금 정보를 덤프하는 데 사용할 수 있습니다. 출력은 압도 될 수 있지만이 잠겨 정확히 알고 싶다면, 그것을 실행하는 가치있는 일입니다. 나는 보통 잠금 문제에 대한 신속 제로로 sp_who2와 함께 그것을 사용할 수 있습니다.

    다른 응답에 추가하려면,는 sp_lock는 실행중인 모든 프로세스에 대한 전체 잠금 정보를 덤프하는 데 사용할 수 있습니다. 출력은 압도 될 수 있지만이 잠겨 정확히 알고 싶다면, 그것을 실행하는 가치있는 일입니다. 나는 보통 잠금 문제에 대한 신속 제로로 sp_who2와 함께 그것을 사용할 수 있습니다.

    사용 가능한 "우호적"는 sp_lock 절차의 여러 다른 버전은 문제의 SQL Server의 버전에 따라 온라인이 있습니다.

    지금 같이 sys.dm_tran_locks는 이런 종류의 일에 대한보기를 사용하는 것이 좋습니다 귀하의 경우, SQL 서버 2005,는 sp_lock는 계속 사용할 수 있지만 사용되지 않습니다. 현재는 sp_lock 기능 "자신의 롤 '하는 방법의 예를 찾을 수 있습니다.

  2. ==============================

    2.이것이 바로 행이 잠겨을 보여주는 것이 아니라,이 당신에게 도움이 할 수있다.

    이것이 바로 행이 잠겨을 보여주는 것이 아니라,이 당신에게 도움이 할 수있다.

    이 작업을 실행하여 차단하는 문 확인할 수 있습니다 :

    select cmd,* from sys.sysprocesses
    where blocked > 0
    

    또한 각 블록이 기다리고 무엇을 말할 것이다. 그래서 당신은 추적 할 수있는 모든 방법까지 다른 블록을 일으킨 첫 번째 블록을 일으킨 문 참조하십시오.

    편집 @MikeBlandford에서 댓글을 추가하려면 :

  3. ==============================

    3.당신은 쿼리를 수행하여 테이블에 현재 잠금을 찾을 수 있습니다.

    당신은 쿼리를 수행하여 테이블에 현재 잠금을 찾을 수 있습니다.

    USE yourdatabase;
    GO
    
    SELECT * FROM sys.dm_tran_locks
      WHERE resource_database_id = DB_ID()
      AND resource_associated_entity_id = OBJECT_ID(N'dbo.yourtablename');
    

    는 sys.dm_tran_locks를 참조하십시오

    동일한 request_owner_type의 여러 인스턴스가 존재하면, request_owner_id 열은 각 인스턴스들을 구별하기 위해 사용된다. 분산 트랜잭션의 경우, request_owner_type과 request_owner_guid 열은 서로 다른 개체의 정보가 표시됩니다.

    예를 들어, 세션 S1은 표 1에 공유 잠금을 소유; 세션 S1에서 실행되는 트랜잭션 T1은 또한 표 1에서 공유 잠금을 소유하고있다. 이 경우는 sys.dm_tran_locks 반환하는 resource_description 열은 동일한 리소스의 두 인스턴스를 표시한다. request_owner_type 열은 하나 개의 세션으로 인스턴스와 트랜잭션으로 다른 표시됩니다. 또한, resource_owner_id 열은 서로 다른 값을 가질 것이다.

  4. ==============================

    4.나는뿐만 아니라 잠겨 항목의 OBJECT_ID 또는 PARTITION_ID 캡처 잠금 장치에 동적 관리 뷰 (DMV)를 사용합니다.

    나는뿐만 아니라 잠겨 항목의 OBJECT_ID 또는 PARTITION_ID 캡처 잠금 장치에 동적 관리 뷰 (DMV)를 사용합니다.

    (당신이 OBJECT_ID 얻을 관찰하고자하는 데이터베이스로 전환해야합니다)

    SELECT 
         TL.resource_type,
         TL.resource_database_id,
         TL.resource_associated_entity_id,
         TL.request_mode,
         TL.request_session_id,
         WT.blocking_session_id,
         O.name AS [object name],
         O.type_desc AS [object descr],
         P.partition_id AS [partition id],
         P.rows AS [partition/page rows],
         AU.type_desc AS [index descr],
         AU.container_id AS [index/page container_id]
    FROM sys.dm_tran_locks AS TL
    INNER JOIN sys.dm_os_waiting_tasks AS WT 
     ON TL.lock_owner_address = WT.resource_address
    LEFT OUTER JOIN sys.objects AS O 
     ON O.object_id = TL.resource_associated_entity_id
    LEFT OUTER JOIN sys.partitions AS P 
     ON P.hobt_id = TL.resource_associated_entity_id
    LEFT OUTER JOIN sys.allocation_units AS AU 
     ON AU.allocation_unit_id = TL.resource_associated_entity_id;
    
  5. ==============================

    5.또한 차단하고 SQL Server 인스턴스에 대한 프로세스를 차단 전류를 얻기 위해 내장 sp_who2 저장 프로 시저를 사용할 수 있습니다. 일반적으로 당신은 프로파일 러에서 발행 SPID 가장 최근의 명령에 차단 과정과 모습을 찾기 위해 SQL 프로파일 러 인스턴스와 함께이 작업을 실행하는 것입니다.

    또한 차단하고 SQL Server 인스턴스에 대한 프로세스를 차단 전류를 얻기 위해 내장 sp_who2 저장 프로 시저를 사용할 수 있습니다. 일반적으로 당신은 프로파일 러에서 발행 SPID 가장 최근의 명령에 차단 과정과 모습을 찾기 위해 SQL 프로파일 러 인스턴스와 함께이 작업을 실행하는 것입니다.

  6. ==============================

    6.당신은 아래의 스크립트를 통해 자세한 내용을 확인할 수 있습니다.

    당신은 아래의 스크립트를 통해 자세한 내용을 확인할 수 있습니다.

    -- List all Locks of the Current Database 
    SELECT TL.resource_type AS ResType 
          ,TL.resource_description AS ResDescr 
          ,TL.request_mode AS ReqMode 
          ,TL.request_type AS ReqType 
          ,TL.request_status AS ReqStatus 
          ,TL.request_owner_type AS ReqOwnerType 
          ,TAT.[name] AS TransName 
          ,TAT.transaction_begin_time AS TransBegin 
          ,DATEDIFF(ss, TAT.transaction_begin_time, GETDATE()) AS TransDura 
          ,ES.session_id AS S_Id 
          ,ES.login_name AS LoginName 
          ,COALESCE(OBJ.name, PAROBJ.name) AS ObjectName 
          ,PARIDX.name AS IndexName 
          ,ES.host_name AS HostName 
          ,ES.program_name AS ProgramName 
    FROM sys.dm_tran_locks AS TL 
         INNER JOIN sys.dm_exec_sessions AS ES 
             ON TL.request_session_id = ES.session_id 
         LEFT JOIN sys.dm_tran_active_transactions AS TAT 
             ON TL.request_owner_id = TAT.transaction_id 
                AND TL.request_owner_type = 'TRANSACTION' 
         LEFT JOIN sys.objects AS OBJ 
             ON TL.resource_associated_entity_id = OBJ.object_id 
                AND TL.resource_type = 'OBJECT' 
         LEFT JOIN sys.partitions AS PAR 
             ON TL.resource_associated_entity_id = PAR.hobt_id 
                AND TL.resource_type IN ('PAGE', 'KEY', 'RID', 'HOBT') 
         LEFT JOIN sys.objects AS PAROBJ 
             ON PAR.object_id = PAROBJ.object_id 
         LEFT JOIN sys.indexes AS PARIDX 
             ON PAR.object_id = PARIDX.object_id 
                AND PAR.index_id = PARIDX.index_id 
    WHERE TL.resource_database_id  = DB_ID() 
          AND ES.session_id <> @@Spid -- Exclude "my" session 
          -- optional filter  
          AND TL.request_mode <> 'S' -- Exclude simple shared locks 
    ORDER BY TL.resource_type 
            ,TL.request_mode 
            ,TL.request_type 
            ,TL.request_status 
            ,ObjectName 
            ,ES.login_name;
    
    
    
    --TSQL commands
    SELECT 
           db_name(rsc_dbid) AS 'DATABASE_NAME',
           case rsc_type when 1 then 'null'
                                 when 2 then 'DATABASE' 
                                 WHEN 3 THEN 'FILE'
                                 WHEN 4 THEN 'INDEX'
                                 WHEN 5 THEN 'TABLE'
                                 WHEN 6 THEN 'PAGE'
                                 WHEN 7 THEN 'KEY'
                                 WHEN 8 THEN 'EXTEND'
                                 WHEN 9 THEN 'RID ( ROW ID)'
                                 WHEN 10 THEN 'APPLICATION' end  AS 'REQUEST_TYPE',
    
           CASE req_ownertype WHEN 1 THEN 'TRANSACTION'
                                         WHEN 2 THEN 'CURSOR'
                                         WHEN 3 THEN 'SESSION'
                                         WHEN 4 THEN 'ExSESSION' END AS 'REQUEST_OWNERTYPE',
    
           OBJECT_NAME(rsc_objid ,rsc_dbid) AS 'OBJECT_NAME', 
           PROCESS.HOSTNAME , 
           PROCESS.program_name , 
           PROCESS.nt_domain , 
           PROCESS.nt_username , 
           PROCESS.program_name ,
           SQLTEXT.text 
    FROM sys.syslockinfo LOCK JOIN 
         sys.sysprocesses PROCESS
      ON LOCK.req_spid = PROCESS.spid
    CROSS APPLY sys.dm_exec_sql_text(PROCESS.SQL_HANDLE) SQLTEXT
    where 1=1
    and db_name(rsc_dbid) = db_name()
    
    
    
    --Lock on a specific object
    SELECT * 
    FROM sys.dm_tran_locks
    WHERE resource_database_id = DB_ID()
    AND resource_associated_entity_id = object_id('Specific Table');
    
  7. from https://stackoverflow.com/questions/694581/how-to-check-which-locks-are-held-on-a-table by cc-by-sa and MIT license