Database Engine 中的鎖定
鎖定是 MicrosoftSQL Server Database Engine 所使用的機制,用以同步處理多個使用者在同一時間存取的相同資料。
在交易取得資料目前狀態的相依性前 (例如讀取或修改資料),它必須保護自己使其免於受到另一個交易修改相同資料的影響。交易可以要求資料的鎖定以達到此目的。鎖定有不同的模式,例如共用或獨佔。鎖定模式可定義交易在資料上的相依性層級。若已授與該資料的鎖定模式給某個交易,就不會再授與鎖定給另一個交易,以免造成衝突。如果交易所要求的鎖定模式,將和已授與相同資料的鎖定造成衝突,Database Engine 將停止要求交易,直到釋放第一個鎖定為止。
當交易修改資料時,它會持有防止修改的鎖定,直到交易結束為止。交易持有保護讀取作業的鎖定時間長度,需視交易隔離等級設定而定。交易完成 (認可或復原) 時,會釋放交易所持有的所有鎖定。
應用程式通常不會直接要求鎖定。Database Engine 中的鎖定管理員會在內部管理鎖定。當 Database Engine 執行個體處理 Transact-SQL 陳述式時,Database Engine 查詢處理器可以決定要存取哪些資源。查詢處理器根據存取類型以及交易隔離等級設定,決定需要哪些類型的鎖定以保護每個資源。查詢處理器接著會對鎖定管理員要求適當的鎖定。如果沒有其他交易持有衝突的鎖定,鎖定管理員就會授與鎖定。
下表列出了說明鎖定主要概念的主題。
主題 |
描述 |
---|---|
鎖定可以要求不同類型的資源,例如資料列、頁面、索引、資料表或資料庫。有些作業在資料粒度的多個層級放置鎖定,以組成鎖定階層。 |
|
鎖定有不同的模式,可指定其他交易對於鎖定資源擁有的存取層級。 |
|
如果多個交易的鎖定模式是相容的,它們就可以取得相同資源的並行鎖定。如果交易所要求的鎖定模式,與現有的鎖定衝突,在釋放第一個鎖定前會先暫停交易。 |
|
鎖定某個範圍的索引鍵,將允許在可序列化隔離等級執行的交易,以防止不明的插入與刪除。 |
|
如果交易取得大量的資料列或頁面鎖定,Database Engine 將可授與資料表鎖定並釋放所有較低層級的鎖定,以便將鎖定負擔降到最低。 |
|
Database Engine 可以根據最佳化工具對於 Transact-SQL 陳述式將參考的資料列數目之估計,來動態選擇鎖定資料粒度的層級。 |
|
Database Engine 與其關聯的 API 提供數個機制,以顯示在執行個體或資料庫中目前持有鎖定的資訊。 |
|
當兩個工作因為對彼此所需的資源擁有鎖定而永遠封鎖對方時,就會發生死結現象。 |