今天要來介紹 MS SQL 的鎖定 (Lock) 和死結 (Deadlock) ~
有可能很少發生,但發生時就會對效能造成很大影響。
MS SQL 資料庫在存取時,會執行資料鎖定。
為什麼要鎖定資料 ? 主要是避免以下情形:
鎖定的層級有許多種,例如層級較低的 Row Lock (資料列鎖定)、Page Lock (資料頁鎖定),層級較高的 Table Lock (資料表鎖定) 等。
而鎖定擴大 (Lock Escalation) 的現象,則是 SQL Server 將多個較低層級的鎖定升級至較高的鎖定,以節省記憶體空間 (因為每個鎖定都要額外耗費記憶體)。不過由於一口氣鎖定的更多的資料,較容易在其他程式存取時,發生阻擋的現象,造成效能降低。
當二或多個程式互相等待鎖定釋放時,就會造成死結,這時會導致程式逾時,而且程式中的 CRUD 的動作也無法完成。
要減少死結狀況,常見的做法是避免同時操作相同的資料表,特別是大量的更新/插入/刪除資料,避免發生鎖定擴大現象。下一篇會提到鎖定擴大的處理方式。
此外,也有以下幾種方法可以減少死結的發生: