數據庫事務和鎖(五)
2024-07-21 02:08:20
供稿:網友
死鎖問題
死鎖是一個很重要的話題。在事務和鎖的使用過程中,死鎖是一個不可避免的現象。在兩種情況下,可以發生死鎖。第一種情況是,當兩個事務分別鎖定了兩個單獨的對象,這時每一個事務都要求在另外一個事務鎖定的對象上獲得一個鎖,因此每一個事務都必須等待另外一個事務釋放占有的鎖,這時,就發生了死鎖。這種死鎖是最典型的死鎖形式。在同一時間內有兩個事務a和b,事務a有兩個操作:鎖定表part和請求訪問表supplier;事務b也有兩個操作:鎖定表supplier和請求訪問表part。結果,事務a和事務b之間發生了死鎖,其示意進程如圖10所示。
圖10 死鎖示意圖
死鎖的第二種情況是,當在一個數據庫中時,有若干個長時間運行的事務執行并行的操作,當查詢分析器處理一種非常復雜的查詢例如連接查詢時,那么由于不能控制處理的順序,有可能發生死鎖現象。
當發生死鎖現象時,系統可以自動檢測到,然后通過自動取消其中一個事務來結束死鎖。在發生死鎖的兩個事務中,根據事務處理時間的長短作為規則來確定他們的優先級。處理時間長的事務具有較高的優先級,處理時間較短的事務具有較低的優先級。在發生沖突時,保留優先級高的事務,取消優先級低的事務。
會話級鎖和表級鎖
一般地,鎖是由系統自動提供的。但是,在有些情況下,用戶也可以定制鎖。也就是說,用戶可以對會話級鎖和表級鎖進行定制。
會話級鎖的定制包括兩個方面,事務孤立等級和鎖超時限制。事務孤立等級保護指定的事務,該事務孤立等級允許對一個會話中的全部事務設置孤立等級。當設置孤立等級時,就為會話中的全部語句指定了默認的鎖定行為。在指定事務孤立等級時,使用到下面一些選項。read committed選項指導系統在讀取數據時,使用共享鎖。在這種選項下,不能體會到臟讀,即不能看到正在修改的數據。但是,在事務結束之前,可以改變數據,所以可以產生不可重復讀數據或者幻覺數據。read uncommitted選項指導系統既不使用共享鎖,也不使用排它鎖。在這種選項下,可以看到正在修改的數據,體會到臟讀。這個選項是限制程度最低的設置。repeatable read選項指導系統在查詢使用的全部數據上放置鎖,防止其他用戶修改數據,但是幻覺讀可以發生。serializable選項指導系統在數據上放置鎖,直到事務完成以后,用戶才可以修改或者插入數據。這個選項是限制程度最高的設置。另外,事務等待訪問的時間也可以定制,這需要設置鎖超時限制。當設置了鎖超時時間以后,如果事務等待的時間超過了鎖超時時間,那么該事務被自動取消。
定制表級鎖就是指通過為表指定一個或者多個選項,設置表級鎖的行為。實際上,定制表級鎖,就是使用一種優化隱藏的方式。優化隱藏就是指在from子句后面,附加上有關的內容選項,提高系統識辨操作的能力。定制表級鎖有許多選項。rowlock選項指導系統使用行級鎖而不是頁級鎖或者表級鎖,這是系統的默認選項。paglock選項指導系統使用頁級鎖。tablock選項指導系統使用表級鎖而不是使用鎖定對象更細的行級鎖或者頁級鎖,并且使用共享鎖,因此允許其他事務讀取表中的數據,但是不能修改表中的數據。tablockx選項指導系統使用排它鎖,防止其他事務讀取或者修改表中的任何數據。nolock選項指導系統不使用鎖,既不使用共享鎖,也不使用排它鎖。在這種情況下,可以體會到臟讀。holdlock選項指導系統占有共享鎖直到該事務的結束,而不是當有其他鎖請求時立即釋放。updlock選項指導事務在讀取表中的數據時,使用修改的頁級鎖代替共享鎖。這個鎖一直占用到該語句或者事務的結束為止。
結論
網絡技術是信息技術發展的趨勢。多用戶、多事務、可伸縮、復制、數據倉庫等等都是為了適應網絡技術的數據庫發展方向。事務作為一個重要的數據庫技術的基本概念,在保護數據庫的可恢復性和多用戶、多事務方面具有基礎性的作用。一個事務就是一個單元的工作,該事務可能包括一條語句,也可能包括一百條語句,而這些語句的所有操作,要么都完成,要么都取消。在數據庫備份和恢復過程中,事務也具有重要作用,可以利用日志進行事務日志備份、增量備份,而不必每一次都執行耗費時間、精力和備份介質的完全備份。鎖是實現多用戶、多事務等并發處理方式的手段。鎖的類型和資源有多種。鎖是由系統自動提供的,用戶也可以進行一些定制。在sql server 7.0中,一個明顯的特征是使用了行級鎖。使用行級鎖引起了數據存儲引擎、事務管理方式等方面的變化。