sql server update時,是行鎖還是表鎖


https://bbs.csdn.net/topics/120000749

http://www.cnblogs.com/s021368/articles/2148659.html

問題:

udpate  a  
set   column1   =   1  
where   idx   =   1
sqlserver   執行update語句的時候,是鎖整張表的吧

 

分析:

看表結構,   如果沒有主鍵無法只鎖定行

如果樓主要驗證的話,   只需要類似下面的方法就行了:

--   開事務,   以保持鎖
BEGIN   TRAN

--   更新
update  a  
set   column1   =   1  
where   idx   =   1

--   列出鎖信息
EXEC   sp_lock   @@spid

--   提交或者回滾事務
COMMIT/ROLLBACK   TRAN

輸出的結果大致是這樣:

通過   dbid,   ObjId   可以找到你更新的表相關的鎖記錄
如果   IndId   為   0   ,   表示鎖在表上,   否則在對應的索引上
通過   Type   列,   可以確定被鎖定的是行/表,   或者是其他,   並且可以通過   Mode   看到是什么鎖
在Status   中,   還可以看到鎖是已經加上了,   還是在等待其他資源釋放(以取得加鎖的權利)

spid       dbid       ObjId               IndId     Type   Resource                                       Mode           Status
------   ------   -----------   ------   ----   --------------------------   --------   ------
53           1             1115151018     0             TAB                                                           IS               GRANT

 

鎖的類型(Tyep   列值,   RID   和   KEY   的話,   表示鎖在行上)   有如下幾種:
RID   =   表中單個行的鎖,由行標識符   (RID)   標識。
KEY   =   索引內保護可串行事務中一系列鍵的鎖。
PAG   =   數據頁或索引頁的鎖。
EXT   =   對某區的鎖。
TAB   =   整個表(包括所有數據和索引)的鎖。
DB   =   數據庫的鎖。
FIL   =   數據庫文件的鎖。
APP   =   指定的應用程序資源的鎖。
MD   =   元數據或目錄信息的鎖。
HBT   =   堆或   B   樹索引的鎖。在   SQL   Server   2005   中此信息不完整。
AU   =   分配單元的鎖。在   SQL   Server   2005   中此信息不完整。

 

其它:

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

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

 


免責聲明!

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



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