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) 其他事務不能讀取表,更新和刪除