對於一般的使用者而言,通過系統的自動鎖定管理機制基本可以滿足使用要求,但如果對資料安全、資料庫完整性和一致性有特殊要求,就需要瞭解SQL Server的鎖機制,掌握資料庫鎖定方法。
各種大型資料庫所採用的鎖的基本理論是一致的,但在具體實現上各有差別。SQL Server更強調由系統來管理鎖。在使用者有SQL請求時,系統分析請求,自動在滿足鎖定條件和系統效能之間為資料庫加上適當的鎖,同時系統在運行期間常常自動進行最佳化處理,實行動態加鎖。對於一般的使用者而言,通過系統的自動鎖定管理機制基本可以滿足使用要求,但如果對資料安全、資料庫完整性和一致性有特殊要求,就需要瞭解SQL Server的鎖機制,掌握資料庫鎖定方法。
鎖是資料庫中的一個非常重要的概念,它主要用於多使用者環境下保證資料庫完整性和一致性。 我們知道,多個使用者能夠同時操縱同一個資料庫中的資料,會發生資料不一致現象。即如果沒有鎖定且多個使用者同時訪問一個資料庫,則當他們的事務同時使用相同的資料時可能會發生問題。這些問題包括:丟失更新、髒讀、不可重複讀取和幻覺讀:
1.當兩個或多個事務選擇同一行,然後基於最初選定的值更新該行時,會發生丟失更新問題。每個事務都不知道其它事務的存在。最後的更新將重寫由其它事務所做的更新,這將導致資料丟失。例如,兩個編輯人員製作了同一文檔的電子複本。每個編輯人員獨立地更改其複本,然後儲存更改後的複本,這樣就覆蓋了原始文檔。最後儲存其更改複本的編輯人員覆蓋了第一個編輯人員所做的更改。如果在第一個編輯人員完成之後第二個編輯人員才能變更,則可以避免該問題。
2. 髒讀就是指當一個事務正在訪問資料,並且對資料進行了修改,而這種修改還沒有提交到資料庫中,這時,另外一個事務也訪問這個資料,然後使用了這個資料。因為這個資料是還沒有提交的資料,那麼另外一個事務讀到的這個資料是髒資料,依據髒資料所做的操作可能是不正確的。例如,一個編輯人員正在更改電子文檔。在更改過程中,另一個編輯人員複製了該文檔(該複本包含到目前為止所做的全部更改)並將其分發給預期的使用者。此後,第一個編輯人員認為目前所做的更改是錯誤的,於是刪除了所做的編輯並儲存了文檔。分發給使用者的文檔包含不再存在的編輯內容,並且這些編輯內容應認為從未存在過。如果在第一個編輯人員確定最終更改前任何人都不能讀取更改的文檔,則可以避免該問題。
3.不可重複讀取是指在一個事務內,多次讀同一資料。在這個事務還沒有結束時,另外一個事務也訪問該同一資料。那麼,在第一個事務中的兩次讀資料之間,由於第二個事務的修改,那麼第一個事務兩次讀到的的資料可能是不一樣的。這樣就發生了在一個事務內兩次讀到的資料是不一樣的,因此稱為是不可重複讀取。例如,一個編輯人員兩次讀取同一文檔,但在兩次讀取之間,作者重寫了該文檔。當編輯人員第二次讀取文檔時,文檔已更改。原始讀取不可重複。如果只有在作者全部完成編寫後編輯人員才可以讀取文檔,則可以避免該問題。
4.幻覺讀是指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的資料進行了修改,這種修改涉及到表中的全部資料行。同時,第二個事務也修改這個表中的資料,這種修改是向表中插入一行新資料。那麼,以後就會發生操作第一個事務的使用者發現表中還有沒有修改的資料行,就好象發生了幻覺一樣。例如,一個編輯人員更改作者提交的文檔,但當生產部門將其更改內容合并到該文檔的主複本時,發現作者已將未編輯的新材料添加到該文檔中。如果在編輯人員和生產部門完成對原始文檔的處理之前,任何人都不能將新材料添加到文檔中,則可以避免該問題。
所以,處理多使用者並發訪問的方法是加鎖。鎖是防止其他事務訪問指定的資源控制、實現並發控制的一種主要手段。當一個使用者鎖住資料庫中的某個對象時,其他使用者就不能再訪問該對象。加鎖對並發訪問的影響體現在鎖的粒度上。為了控制鎖定資源,應該首先瞭解系統的空間管理。在SQL Server 2000系統中,最小的空間管理單位是頁,一個頁有8K。所有的資料、日誌、索引都存放在頁上。另外,使用頁有一個限制,這就是表中的一行資料必須在同一個頁上,不能跨頁。頁上面的空間管理單位是盤區,一個盤區是8個連續的頁。表和索引的最小佔用單位是盤區。資料庫是由一個或者多個表或者索引組成,即是由多個盤區組成。放在一個表上的鎖限制對整個表的並發訪問;放在盤區上的鎖限制了對整個盤區的訪問;放在資料頁上的鎖限制了對整個資料頁的訪問;放在行上的鎖只限制對該行的並發訪問。
SQL Server 2000 具有多粒度鎖定,允許一個事務鎖定不同類型的的資源。為了使鎖定的成本減至最少,SQL Server 自動將資源鎖定在適合任務的層級。鎖定在較小的粒度(例如行)可以增加並發但需要較大的開銷,因為如果鎖定了許多行,則需要控制更多的鎖。鎖定在較大的粒度(例如表)就並發而言是相當昂貴的,因為鎖定整個表限制了其它事務對錶中任意部分進行訪問,但要求的開銷較低,因為需要維護的鎖較少。SQL Server 可以鎖定行、頁、擴充盤區、表、庫等資源。
行是可以鎖定的最小空間, 行級鎖佔用的資料資源最少,所以在事務的處理過程中,允許其他事務繼續操縱同一個表或者同一個頁的其他資料,大大降低了其他事務等待處理的時間,提高了系統的並發性。