查看SQL Server被鎖的表以及如何解鎖


鎖定數據庫的一個表的區別
  SELECT * FROM table WITH (HOLDLOCK) 其他事務可以讀取表,但不能更新刪除
  SELECT * FROM table WITH (TABLOCKX) 其他事務不能讀取表,更新和刪除

SELECT語句中的各項“加鎖選項”以及相應的功能說明。
NOLOCK(不加鎖)
此選項被選中時,SQL Server 在讀取或修改數據時不加任何鎖。 在這種情況下,用戶有可能讀取到未完成事務(Uncommited Transaction)或回滾(Roll Back)中的數據, 即所謂的“臟數據”。
NOLOCK 語句執行時不發出共享鎖,允許臟讀 ,等於 READ UNCOMMITTED事務隔離級別

HOLDLOCK(保持鎖)
此選項被選中時,SQL Server 會將此共享鎖保持至整個事務結束,而不會在途中釋放。
HOLDLOCK 持有共享鎖,直到整個事務完成,應該在被鎖對象不需要時立即釋放,等於SERIALIZABLE事務隔離級別

UPDLOCK(修改鎖)
此選項被選中時,SQL Server 在讀取數據時使用修改鎖來代替共享鎖,並將此鎖保持至整個事務或命令結束。使用此選項能夠保證多個進程能同時讀取數據但只有該進程能修改數據。

TABLOCK(表鎖)
此選項被選中時,SQL Server 將在整個表上置共享鎖直至該命令結束。 這個選項保證其他進程只能讀取而不能修改數據。

PAGLOCK(頁鎖)
此選項為默認選項, 當被選中時,SQL Server 使用共享頁鎖。
PAGLOCK 在使用一個表鎖的地方用多個頁鎖

TABLOCKX(排它表鎖)
此選項被選中時,SQL Server 將在整個表上置排它鎖直至該命令或事務結束。這將防止其他進程讀取或修改表中的數據。 TABLOCKX 強制使用獨占表級鎖,這個鎖在事務期間阻止任何其他事務使用這個表

READPAST 讓sql server跳過任何鎖定行,執行事務,適用於READ UNCOMMITTED事務隔離級別只跳過RID鎖,不跳過頁,區域和表鎖
ROWLOCK 強制使用行鎖
UPLOCK 強制在讀表時使用更新而不用共享鎖

 

查看被鎖表:
select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName
from sys.dm_tran_locks where resource_type='OBJECT'
spid 鎖表進程
tableName 被鎖表名

解鎖:
declare @spid int
Set @spid = 57 --鎖表進程
declare @sql varchar(1000)
set @sql='kill '+cast(@spid as varchar)
exec(@sql)

 

USE master;
GO
EXEC sp_who 'active';
GO
EXEC sp_who2 'active';
GO

USE master;
GO
KILL spid | UOW [WITH STATUSONLY]
GO


select  
    object_name(P.object_id) as TableName,    
    resource_type, resource_description,request_session_id
from
    sys.dm_tran_locks L
    join sys.partitions P on L.resource_associated_entity_id = p.hobt_id
 
 kill ID

--Other Information about Locks:
select * from sys.dm_tran_locks   
SELECT * FROM sys.dm_exec_requests WHERE blocking_session_id<>0 

select * from sys.sysprocesses 

select
  object_name(resource_associated_entity_id) as 'TableName' ,*
from
  sys.dm_tran_locks
where resource_type = 'OBJECT'
  and resource_database_id = DB_ID()
GO

 




EXEC sp_who active --看哪個引起的阻塞,blk blk<>0

EXEC sp_lock --看鎖住了那個資源id,objid objid<>0

 

參考:https://www.mssqltips.com/sqlservertip/2732/different-techniques-to-identify-blocking-in-sql-server/

https://sites.google.com/site/mssqlserverworkstation/follow-me/blog/howtofindlockedtablesandkillsessioninsqlserver


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM