鎖定資料粒度和階層
MicrosoftSQL Server Database Engine 擁有多個資料粒度的鎖定 (Lock),允許交易鎖定不同類型的資源。為了把鎖定的成本降至最低,Database Engine自動依照工作的適當層級來鎖定資源。鎖定於較小的資料粒度 (Granularity) 如資料列可以提高並行,但如果鎖定許多的資料列則由於必須持有更多的鎖定而造成更高的負擔。鎖定於較大的資料粒度如資料表,從並行的角度來看則由於鎖定整個資料表會限制其他交易對於資料表其他部份的存取因而更費時。但由於必須維持的鎖定較少因此負擔較低。
Database Engine通常必須在資料粒度的多個層級取得鎖定,以完全保護資源。在資料粒度的多個層級之鎖定群組稱為鎖定階層。例如,若要充份地保護索引的讀取,Database Engine可能需要取得資料列的共用鎖定以及頁面和資料表的意圖共用鎖定。
下表顯示Database Engine可以鎖定的資源。
資源 |
描述 |
---|---|
RID |
資料列識別碼,用來鎖定堆積內單一資料列。 |
KEY |
索引中的資料列鎖定,用來保護可序列化交易中的索引鍵範圍。 |
PAGE |
資料庫中的 8 KB 頁面,例如資料或索引頁面。 |
EXTENT |
連續八個頁面的群組,例如資料頁或索引頁面。 |
HoBT |
堆積或 B 樹狀目錄。針對資料表中沒有叢集索引的 B 型樹狀結構 (索引) 或堆積資料頁面進行保護鎖定。 |
TABLE |
一整個資料表,包含所有資料和索引。 |
FILE |
資料庫檔案 |
APPLICATION |
應用程式指定資源。 |
METADATA |
中繼資料鎖定。 |
ALLOCATION_UNIT |
配置單位。 |
DATABASE |
一整個資料庫。 |
[!附註]
ALTER TABLE 的 LOCK_ESCALATION 選項可影響 HoBT 和 TABLE 鎖定。