SqlServer查看鎖表與解鎖


鎖定數據庫的一個表 
SELECT * FROM table WITH (HOLDLOCK) 

注意: 鎖定數據庫的一個表的區別 
SELECT * FROM table WITH (HOLDLOCK) 

其他事務可以讀取表,但不能更新刪除 
SELECT * FROM table WITH (TABLOCKX) 

其他事務不能讀取表,更新和刪除 
SELECT 語句中“加鎖選項”的功能說明 

SQL Server提供了強大而完備的鎖機制來幫助實現數據庫系統的並發性和高性能。用戶既能使用SQL Server的缺省設置也可以在select 語句中使用“加鎖選項”來實現預期的效果。 本文介紹了SELECT語句中的各項“加鎖選項”以及相應的功能說明。 

功能說明:  
NOLOCK(不加鎖) 
此選項被選中時,SQL Server 在讀取或修改數據時不加任何鎖。 在這種情況下,用戶有可能讀取到未完成事務(Uncommited Transaction)或回滾(Roll Back)中的數據, 即所謂的“臟數據”。 

HOLDLOCK(保持鎖) 
此選項被選中時,SQL Server 會將此共享鎖保持至整個事務結束,而不會在途中釋放。 

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

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

PAGLOCK(頁鎖) 
此選項為默認選項, 當被選中時,SQL Server 使用共享頁鎖。 

TABLOCKX(排它表鎖) 
此選項被選中時,SQL Server 將在整個表上置排它鎖直至該命令或事務結束。這將防止其他進程讀取或修改表中的數據。 


  HOLDLOCK 持有共享鎖,直到整個事務完成,應該在被鎖對象不需要時立即釋放,等於SERIALIZABLE事務隔離級別 
  NOLOCK 語句執行時不發出共享鎖,允許臟讀 ,等於 READ UNCOMMITTED事務隔離級別 
  PAGLOCK 在使用一個表鎖的地方用多個頁鎖 
  READPAST 讓sql server跳過任何鎖定行,執行事務,適用於READ UNCOMMITTED事務隔離級別只跳過RID鎖,不跳過頁,區域和表鎖 
  ROWLOCK 強制使用行鎖 
  TABLOCKX 強制使用獨占表級鎖,這個鎖在事務期間阻止任何其他事務使用這個表 
  UPLOCK 強制在讀表時使用更新而不用共享鎖 

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

 

 

出處:https://blog.csdn.net/LazyLeland/article/details/17020117

==================================================================================================

某些情況下,sqlserver的表會被鎖住,比如某個會話窗口有數據一直沒提交,窗口又沒關閉,或者執行刪除等大量循環的時候,這時表就會被鎖住

其他任何連接查詢表數據時都不會返回,這時需要手工殺掉產生死鎖的會話ID,才能恢復正常。

 

查看被鎖表:

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)

 

sql server在執行查詢語句時會鎖表。在鎖表期間禁止增刪改操作。

如果不想鎖表,那就再表名或別名后面加上WITH(NOLOCK)  ,如下所示:

SELECT Id FROM dbo.T_Table WITH(NOLOCK) WHERE Id = 1

 

 

出處:https://blog.csdn.net/gyxinguan/article/details/81095076

=================================================================

1、select * from sys.dm_tran_locks或sp_LOCK 查看request_mode 字段中為'X'(排他鎖)或'IX'(意向排他鎖)
2、用sp_who2 + pid(進程ID) 查看進程的詳細信息
3、用dbcc inputbuffer(pid) 查看一起死鎖的語句內容

==


免責聲明!

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



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