實驗細節:爲什麼objectID(N'tablename')不鎖定並且name ='tablename'鎖定sys.objects?
我在Microsoft SQL Server Management Studio中運行此。 在一個查詢窗口,我跑:
BEGIN TRANSACTION a;
ALTER table <table name>
ALTER column <column> varchar(1025)
另外我運行:
SELECT 1
FROM sys.objects
WHERE name = ' <other_table name>'
或者這樣:
SELECT 1
FROM sys.objects
WHERE object_id = OBJECT_ID(N'[<other_table name>]')
出於某種原因與名稱選擇=不返回,直到我確實承諾傳遞。
我做交易,以模擬ALTER列的長時間操作,我們已經在我們的數據庫的時候。我不想傷害其他行動。
如果你看看兩者的實際執行計劃,你應該看到'name'變體在非聚集索引和單獨的查找步驟上使用seek。而object_id變體只是執行聚集索引查找。我還會注意到,該交易似乎對某些密鑰持有一些排他鎖。我還沒有設法構建一個完整的理論(因此評論不答覆),但我認爲它可能涉及到第一個查詢可能不得不掃描範圍(因爲重複的名稱是可能的)。不幸的是,'OBJECT_ID'是一個黑盒子,所以不清楚它爲什麼沒有鎖定就可以工作。 –