SQL鎖和併發

        併發是所有數據庫的主要問題。它描述了兩個或多個用戶嘗試同時處理一個對象的概念。交互操作的本質對每個用戶來說都是不同的(更新、刪除、讀取和插入),處理這種對象更改控制所發生的衝突的理想方法,取決於這些用戶正在做的工作內容,以及這些工作的重要性。用戶越多(更確切地講,事務越多),即在同一時刻可以完成事情越多,併發性也就越高。

        在聯機事務處理環境下,在數據中首先要處理的事情通常就是併發,聯機分析處理則通常作爲事後的內容:它並不需要在那裏出現,但是的確出現了。處理併發問題對系統的性能至關重要,在數據庫中,處理併發的基本方法是一個稱爲鎖定的過程。

       鎖是一種機制,用來防止進程對對象進行操作的時候,與已經在該對象上執行的某些操作發生衝突,也就是說,如果某人之前已經在對象上進行過操作,你就不能再對這個對象進行操作了。能否在對象上執行操作,取決於其他用戶正在執行什麼操作。

      SQL Server的鎖管理器就是這個店主。當你進入SQL Server“商店”,所管理器會詢問你的意圖——也就是你要做什麼。如果你說“只是隨便看看”,而且這裏所有的人都“只是隨便看看”那麼鎖管理器就會讓你進入。如果你希望購買或更新刪除某些東西,那麼鎖管理器就會檢查,看看別人是否已經在這兒了。如果這樣你就必須等待。任何在你之後來到的人也必須等待。當允許你進入購買商品的時候,別人也不能進入,直至你完成操作爲止。

      通過這種操作機制,SQL Server能夠幫助我們避免那些因爲併發問題而生成的許多不同錯誤。我們會檢查發生錯誤的可能性,並瞭解應該如何設置事務隔離級別才能防止這些錯誤。不過現在先看看什麼能鎖,以及那些種類的鎖可供使用。

     通過鎖可以防止的問題,鎖可以解決4個主要的問題:髒讀,不可重複、幻影、丟失更新

    每項都會各自產生一系列的問題,可以混合使用那些設置了合理的事務隔離級別的解決辦法來解決這些問題。

    1.髒讀

     當事務讀取一條記錄,而該記錄是另一尚未完成的事務一部分時,就會發生髒讀。如果第一個事務正常完成,那麼這樣做似乎不會出現問題。但是如果這個事務被回滾情況又會怎樣呢?你會從事務中得到消息,從數據庫的角度來說,並不存在這樣的信息!

    事務2現在正在使用一個已經失效的值,如果試圖返回審覈,會發現根本無法追蹤要該數字的來源,這件事情很令人頭疼。幸運的是,如果使用SQL Server默認的事務隔離級別,就不會發生這樣的事情。

2.不可重複讀

很容易把他同髒讀混淆。不過不用擔心——這只是術語而已。概念纔是重要的。在一個事務中兩次讀取記錄,並且在兩次讀取之間,只有一個事務修改了這個數據,那麼就會導致不可重複讀。

發佈了93 篇原創文章 · 獲贊 58 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章