婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 為什么我們需要在SQL Server里更新鎖

為什么我們需要在SQL Server里更新鎖

熱門標簽:寧波人工外呼系統有效果嗎 洛陽外呼系統平臺 真人語音電銷機器人 電銷機器人被曝光 怎樣把地圖標注導入公司地址 400外呼系統合法 如何在地圖標注自己店鋪 地圖標注一個圓圈怎么用 廣州人工電銷機器人費用

每次講解SQL Server里的鎖和阻塞(Locking Blocking)都會碰到的問題:在SQL Server里,為什么我們需要更新鎖?在我們講解具體需要的原因前,首先我想給你介紹下當更新鎖(Update(U)Lock)獲得時,根據它的兼容性鎖本身是如何應對的。

一般來說,當執行UPDATE語句時,SQL Server會用到更新鎖(Update Lock)。如果你查看對應的執行計劃,你會看到它包含3個部分:

讀取數據
計算新值
寫入數據

在查詢計劃的第1部分,SQL Server初始讀取要修改的數據,在各個記錄上會獲得更新鎖(Update Locks)。在查詢計劃的最后第3部分,當數據被修改時,這些更新鎖(Update Locks)轉化為排它鎖(Exclusive(X))。用這個方法產生的問題都是一樣的:在第1個階段,SQL Server為什么要獲得更新鎖(Update Locks),而不是共享鎖(Shared(S) Locks)。平常當你通過SELECT語句讀取數據,共享鎖(Shared(S) Locks)已經夠用了。現在的更新查詢計劃為什么有這個區別?我們來詳細分析下。

回避死鎖(Deadlock Avoidance)
首先在更新查詢計劃里,更新鎖用來避免死鎖情形。假設在計劃的第1階段,有多個更新查詢計劃獲得共享鎖(Shared(S)Locks),然后在查詢計劃的第3階段,當數據最后被修改時,這些共享鎖(Shared Locks)轉化為排它鎖(Exclusive Loks),會發生什么:

第1個查詢不能轉化共享鎖為排它鎖,因為第2個查詢已經獲得了共享鎖。
第2個查詢不能轉化共享鎖為排它鎖,因為第1個查詢已經獲得了共享鎖。

這是其中一個主要原因,為什么關系數據庫引擎引入更新鎖來實現避免特定的死鎖情形。一個更新鎖只與一個共享鎖兼容,但不與另一個更新或排它鎖兼容。因此死鎖情形可以被避免,應為2個更新查詢計劃不可能同時并發運行。在查詢的第1階段,第2個查詢會一直等到獲得更新鎖。System R的一個未公開研究也展示如何避免這類顯著的死鎖。System R不實用任何更新鎖來實現避免死鎖。

提升的并發

在第1階段不獲得更新鎖,在這個階段直接獲得排它鎖也是可見選項。這會克服死鎖問題,因為排它鎖與另一個排它鎖不兼容。但這個方法的問題是并發受限制,因為同時沒有其他的SELECT查詢可以讀取當前有排它鎖的數據。因此需要更新鎖,因為這個特定鎖與傳統的共享鎖兼容。這樣的話其他的SELECT查詢可以讀取數據,只要這個更新鎖還沒轉化為排它鎖。作為副作用,這會提高我們并發運行查詢的并發性。

在以前關系學術上,更新鎖是所謂的非對稱鎖(Asymmetric Lock)。在更新鎖的上下文里,這個更新鎖與共享鎖兼容,但反之就不是:共享鎖與更新鎖不兼容。但SQL Server并不把共享鎖作為非對稱鎖實現。更新鎖是個對稱(symmetric)的,就是說更新鎖和共享鎖是彼此雙向兼容的。這會提供系統的整體并發,因為在2個鎖類型鍵不會引入阻塞情形。

小結
在今天的文章里我給你介紹了共享鎖,還有為什么需要共享鎖。如你所見在關系數據庫,是強烈需要更新鎖的,因為不然的就會帶來死鎖并降低并發。我希望現在你已經很好的理解了更新鎖,還有在SQL Server里它們是如何使用的。

以上就是本文的全部內容了,希望大家可以喜歡。

您可能感興趣的文章:
  • 淺析Sql server鎖,獨占鎖,共享鎖,更新鎖,樂觀鎖,悲觀鎖

標簽:北海 東營 珠海 咸寧 南昌 石家莊 晉中 煙臺

巨人網絡通訊聲明:本文標題《為什么我們需要在SQL Server里更新鎖》,本文關鍵詞  為什么,我們,需,要在,SQL,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《為什么我們需要在SQL Server里更新鎖》相關的同類信息!
  • 本頁收集關于為什么我們需要在SQL Server里更新鎖的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 敖汉旗| 右玉县| 陇西县| 奇台县| 高州市| 蕉岭县| 阳高县| 安福县| 长子县| 保德县| 通辽市| 西乌珠穆沁旗| 昌宁县| 依安县| 德阳市| 阜城县| 绥芬河市| 德钦县| 宁陕县| 叙永县| 逊克县| 北辰区| 独山县| 将乐县| 承德市| 济南市| 呼玛县| 桦甸市| 墨脱县| 佛坪县| 赣榆县| 保定市| 海伦市| 达尔| 朝阳区| 平陆县| 深泽县| 阳新县| 宕昌县| 二连浩特市| 长乐市|