//sp_lock存儲過程返回的列如下:
spid、dbid、objid、indid、type、resource、mode和status字段。spid是進程標識號碼,用於識別到SQL 服務器的連接。要發現哪些用戶和該spid相連,你就要執行存儲過程sp_who,並將spid作爲一個參數傳輸給該程序。dbid是鎖定發生的數據庫,你可以在主數據庫中的sysdatabases表格中找到它。字段objid用來顯示在數據庫中鎖定發生所在的對象。要查看這個對象,你可以在主數據庫中的sysobjects表格中查詢指定的objid。
SQL Server數據庫引擎爲了保證每一次只有一個線程同時訪問同一個資源的對象而採用的一種鎖定機制,系統有大量鎖時就產生了“數據阻塞”。因此你的數據庫設計和程序編制應該科學和合理,以便讓sql server涉及的鎖定的數量降到最少。當你的系統的反應遲緩時就應該注意數據庫是否產生了阻塞。sp_lock是SQL Server 2000 的一個系統存儲過程,EXECUTE sp_lock 執行這個存儲過程,可以查看當前阻塞的數據表,以便分析程序,解決問題。
//查詢已鎖事務和表名
select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tran_locks where resource_type='OBJECT'
//解鎖
declare @spid int
Set @spid = 57 --鎖表進程
declare @sql varchar(1000)
set @sql='kill '+cast(@spid as varchar)
exec(@sql)