iT邦幫忙

2023 iThome 鐵人賽

DAY 22
0
自我挑戰組

C# 和 SQL 探索之路 - 2系列 第 22

Day 22: SQL 的鎖定 (Lock) 和死結 (Deadlock)

  • 分享至 

  • xImage
  •  

今天要來介紹 MS SQL 的鎖定 (Lock) 和死結 (Deadlock) ~
有可能很少發生,但發生時就會對效能造成很大影響。

關於鎖定

MS SQL 資料庫在存取時,會執行資料鎖定。
為什麼要鎖定資料 ? 主要是避免以下情形:

  1. 避免兩個更新作業同時進行,導致其中一方的更新資料遺失的問題。
  2. 不要讀取到未被認可 (Commit) 的資料。
  3. 避免讀取過的資料已經被修改過。
  4. 當同一次交易 (Transcation) 重複多次選取同樣資料時,避免每次的選取有不一樣的情形。

鎖定的層級有許多種,例如層級較低的 Row Lock (資料列鎖定)、Page Lock (資料頁鎖定),層級較高的 Table Lock (資料表鎖定) 等。

而鎖定擴大 (Lock Escalation) 的現象,則是 SQL Server 將多個較低層級的鎖定升級至較高的鎖定,以節省記憶體空間 (因為每個鎖定都要額外耗費記憶體)。不過由於一口氣鎖定的更多的資料,較容易在其他程式存取時,發生阻擋的現象,造成效能降低。

關於死結

當二或多個程式互相等待鎖定釋放時,就會造成死結,這時會導致程式逾時,而且程式中的 CRUD 的動作也無法完成。

要減少死結狀況,常見的做法是避免同時操作相同的資料表,特別是大量的更新/插入/刪除資料,避免發生鎖定擴大現象。下一篇會提到鎖定擴大的處理方式。

此外,也有以下幾種方法可以減少死結的發生:

  • 在不同的程式中,以相同的順序存取資料。
  • 避免在交易中的使用者互動。
  • 保持批次作業中的交易簡短,避免批次同時作業時,互相阻擋其他交易的動作。
  • 使用較低的隔離層級 (Isolation Level)。
  • 使用基於資料列的隔離層級。
  • 使用 Bound Connection。

參考資料


上一篇
Day 21: SQL 使用 CTE
下一篇
Day 23: SQL 鎖定擴大
系列文
C# 和 SQL 探索之路 - 230
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言