如何“获取”记录的状态???比如,一条记录,有一个进程在持续的更新着它的数值,当然中间有时间间隔。问题:现在另一个进程想要修改一下它的数值。   首先是不是应该获取该条记录的状态,如果锁定了那么就不要更新,否则就更新记录。    Master,大师还有没有其它的方法。

解决方案 »

  1.   

    可以通过系统视图或者DMV查询到表上当前是否有锁或者有什么类型的锁吗?
      

  2.   

    展示当前库的所有锁:
    -- 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;
      

  3.   

    或者使用sp_lock来查询某个会话的锁。