91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SQLServer數據庫中的SQLServer鎖的本質以及作用是什么

發布時間:2021-09-18 16:15:10 來源:億速云 閱讀:321 作者:柒染 欄目:編程語言

今天就跟大家聊聊有關SQLServer數據庫中的SQLServer鎖的本質以及作用是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

一、SQL Server鎖的本質

鎖的定義:鎖主要用于多用戶環境下,保證數據庫完整性和一致性的技術。

鎖的解釋:當多個用戶并發地存取數據時,在數據庫中就會產生多個事務同時存取同一數據的情況。若對并發操作不加控制就可能會讀取和存儲不正確的數據,破壞數據庫的完整性和一致性。當事務在對某個數據對象進行操作前,先向系統發出請求,對其加鎖。加鎖后事務就對該數據對象有了一定的控制。

二、SQL Server鎖的分類

鎖的分類,在教材上,網絡上好多都是按兩個維度來描述的。一種維度是按鎖的功能來劃分,一種維度是按概念來劃分。

1)、按概念劃分(從程序員的角度看)

?  悲觀鎖(Pessimistic Lock)

?  樂觀鎖(Optimistic Lock)

2)、按鎖的功能來劃分(從數據庫系統的角度來看)

?  共享鎖 (S)  (Shared (S) Locks) 用于不更改或不更新數據的操作(只讀操作),如SELECT語句。

?  更新鎖 (U) (Update (U) Locks)用于可更新的資源中。防止當多個會話在讀取、鎖定以及隨后可能進行的資源更新時發生常見形式的死鎖。

?  排它鎖 (X) (Exclusive (X) Locks) 用于數據修改操作,例如INSERT、UPDATE或DELETE。確保不會同時對同一資源進行多重更新。

?  意向鎖 (I)(Intent Locks) 用于建立鎖的層次結構。意向鎖的類型為:意向共享(IS)、意向排它(IX)以及與意向排它共享(SIX)。

SQLServer數據庫中的SQLServer鎖的本質以及作用是什么

三、認識SQL Server數據庫鎖

1)、共享鎖 (S)

 共享鎖 (S) (Shared (S) Locks) 用于不更改或不更新數據的操作(只讀操作),如SELECT語句。

2)、 更新鎖 (U)

 更新鎖 (U) (Update (U) Locks) 用于可更新的資源中。防止當多個會話在讀取、鎖定以及隨后可能進行的資源更新時發生常見形式的死鎖。

3)、排它鎖 (X)

排它鎖 (X) (Exclusive (X) Locks) 用于數據修改操作,例如INSERT、UPDATE或DELETE。確保不會同時對同一資源進行多重更新。

4)、意向鎖 (I)

意向鎖 (I) (Intent Locks)  用于建立鎖的層次結構。意向鎖的類型為:意向共享(IS)、意向排它(IX)以及與意向排它共享(SIX)。

四、如何避免鎖升級

?  1、防止鎖升級的最簡單,最安全的方法是保持事務的簡短,并減少昂貴查詢的鎖占用空間,以便不超過鎖升級閾值,有幾種方法可以實現這一目標。將大批量操作分解為幾個較小的操作。刪除大量數據的時候,可以一次只刪除500個,執行多次,可以顯著減少每個事務累積的鎖定數量并防止鎖定升級。

? 2、 創建索引使查詢盡可能高效來減少查詢的鎖定占用空間。如果沒有索引會造成表掃描可能會增加鎖定升級的可能性, 更可怕的是,它增加了死鎖的可能性,并且通常會對并發性和性能產生負面影響。根據查詢條件創建合適的索引,最大化提升索引查找的效率,此優化的一個目標是使索引查找返回盡可能少的行,以最小化查詢的的成本。

五、死鎖的本質

死鎖(Dead Lock)

死鎖是指一種進程之間互相永久阻塞的狀態,可能涉及兩個或更多的進程。死鎖是指在一組進程中的各個進程均占有不會釋放的資源,但因互相申請被其他進程所站用不會釋放的資源而處于的一種永久等待狀態。

六、如何預防死鎖

 首先要理解,在多并發的環境中死鎖是不可避免的,只能通過合理的數據庫設計、良好的索引、適當的查詢語句以及隔離等級等措施盡量減少死鎖。

 最開始列出了死鎖的4個必要條件,只要想辦法破壞任意1個或多個條件就可以避免產生死鎖。下列方法有助于最大限度的降低死鎖:

 a) 按同一順序訪問對象;

SQLServer數據庫中的SQLServer鎖的本質以及作用是什么

 b)避免事務中的用戶交互,也就是在事務執行過程中不要包含用戶交互的步驟;

 c)保持事務簡短并在一個批處理中;

 d)SELECT語句加WITH(NOLOCK)提示;

SELECT * FROM TableName WITH(NOLOCK);

七、如何利用鎖來解決并發性帶來的問題

1、并發性具體帶來什么問題?

在多用戶環境中,在同一時間可能會有多個用戶更新相同的記錄,這會產生沖突。這就是著名的并發性問題。

1)、臟讀取:當一個事物讀取其它完成一半事務的記錄時,就會發生臟讀取。

例:用戶A和用戶B看到的值都是5,用戶B將值修改為2,用戶A看到的值仍然是5,這時就發生了臟讀取。

2)、不可重復讀取:在每次讀數據時,如果你獲得的值都不一樣,那表明你遇到了不可重復讀取問題。

例:用戶A看到的值是5,用戶B將值修改為2,用戶A刷新后看到的值仍然是5,這時就發生了不可重復讀取。

3)、虛幻行:如果update和delect SQL語句未對數據造成影響,很可能遇到了虛幻行問題。

例:用戶A將所有值都把5修改為2,用戶B使用值2插入一個新記錄,用戶A查詢所有值為2的記錄,但卻找不到新添加的記錄,這時就叫虛幻行。

4)、更新丟失:一個事務的更新覆蓋了其它事務的更新結果,就是所謂的更新丟失。

例:用戶A將所有值從5修改為2,用戶B將所有值從2修改為5,用戶A丟失了他的更新。

2、如何解決并發性的問題

為了解決這些并發帶來的問題。我們需要引入并發控制機制。

悲觀鎖(Pessimistic Lock)——應用場景:寫多

顧名思義,很悲觀。每次去拿數據的時候都認為別人會修改數據,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會阻塞直到它拿到鎖。

樂觀鎖(Optimistic Lock)——應用場景:讀多

顧名思義,很樂觀,每次去拿數據的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷在此期間別人有沒有去更新這個數據。

1,樂觀鎖適用于多讀的應用類型,這樣可以提高吞吐量。

2,樂觀鎖一般加時間戳字段(或者自定義版本號字段)來實現。

在實際生產環境里邊,如果并發量不大且不允許臟讀,可以使用悲觀鎖解決并發問題;但如果系統的并發非常大的話,悲觀鎖定會帶來非常大的性能問題,所以我們就要選擇樂觀鎖定的方法。

八、思考與總結

樂觀鎖復雜事務控制

樂觀鎖:大多數是基于數據版本(version)的記錄機制實現的。即為數據增加一個 版本標識,在基于數據庫表的版本解決方案中,一般是通過為數據庫表添加一個”version" 字段來實現讀取出數據時,將此版本號同讀出,之后更新時,對此版本號加1。此時,將提交數據的版本號與數據庫表對應記錄的當前版本號進行比對,如果提交的數據版本號大于數據庫當前版本號,則予以更新,否則認為是過期數據。

看完上述內容,你們對SQLServer數據庫中的SQLServer鎖的本質以及作用是什么有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

休宁县| 济阳县| 贵阳市| 丹棱县| 宣汉县| 东平县| 梓潼县| 宁国市| 万山特区| 共和县| 河南省| 康乐县| 商都县| 黄石市| 云南省| 叶城县| 昔阳县| 讷河市| 通榆县| 汝城县| 金堂县| 南乐县| 邓州市| 汝州市| 丽水市| 新民市| 博湖县| 塔城市| 濮阳市| 怀来县| 大理市| 敦化市| 满洲里市| 纳雍县| 绥滨县| 和田市| 富阳市| 镶黄旗| 天长市| 福贡县| 云林县|