資料庫中的鎖

2021-07-02 04:05:47 字數 3037 閱讀 5847

資料庫

sql server

delete

儲存database

manager

11.5.1 鎖的概念

鎖(lock) 是在多使用者環境下對資源訪問的一種限制。機制當對乙個

11.5.1 鎖的概念

鎖(lock) 是在多使用者環境下對資源訪問的一種限制。機制當對乙個資料來源加鎖後,此資料來源就有了一定的訪問限制。我們就稱對此資料來源進行了「鎖定」。在sql server中,可以對以下的物件進行鎖定:

資料行(row):資料頁中的單行資料; 索引行(key):索引頁中的單行資料,即索引的鍵值; 頁(page):頁是sql server 訪問資料的基本單位,其大小為8kb; 盤區(extent):乙個盤區由8 個連續的頁組成; 表(table); 資料庫(database)。 11.5.2 鎖的類別

在sql server 中,鎖有兩種分類方法。

(1) 從資料庫系統的角度來看

鎖分為以下三種型別:

獨佔鎖(exclusive lock)

獨佔鎖鎖定的資源只允許進行鎖定操作的程式使用,其它任何對它的操作均不會被接 受。執行資料更新命令,即insert、 update 或delete 命令時,sql server 會自動 使用獨佔鎖。但當物件上有其它鎖存在時,無法對其加獨佔鎖。獨佔鎖一直到事務結束才 能被釋放。 共享鎖(shared lock)

共享鎖鎖定的資源可以被其它使用者讀取,但其它使用者不能修改它。在select 命令 執行時,sql server 通常會對物件進行共享鎖鎖定。通常加共享鎖的資料頁被讀取完畢 後,共享鎖就會立即被釋放。 更新鎖(update lock)

更新鎖是為了防止死鎖而設立的。當sql server 準備更新資料時,它首先對資料物件作更新鎖鎖定,這樣資料將不能被修改,但可以讀取。等到sql server 確定要進行更新資料操作時,它會自動將更新鎖換為獨佔鎖。但當物件上有其它鎖存在時,無法對其作更新鎖鎖定。

(2)從程式設計師的角度看

鎖分為以下兩種型別:

樂觀鎖(optimistic lock)

樂觀鎖假定在處理資料時,不需要在應用程式的**中做任何事情就可以直接在記錄上加鎖、即完全依靠資料庫來管理鎖的工作。一般情況下,當執行事務處理時sql server會自動對事務處理範圍內更新到的表做鎖定。 悲觀鎖(pessimistic lock)

悲觀鎖對資料庫系統的自動管理不感冒,需要程式設計師直接管理資料或物件上的加鎖處理,並負責獲取、共享和放棄正在使用的資料上的任何鎖。

11.5.3 隔離級別

隔離(isolation) 是計算機安全學中的一種概念,其本質上是一種封鎖機制。它是指 自動資料處理系統中的使用者和資源的相關牽制關係,也就是使用者和程序彼此分開,且和操 作系統的保護控制也分開來。在sql server 中,隔離級(isolation level) 是指乙個事務 和其它事務的隔離程度,即指定了資料庫如何保護(鎖定)那些當前正在被其它使用者或服 務器請求使用的資料。指定事務的隔離級與在select 語句中使用鎖定選項來控制鎖定 方式具有相同的效果。

在sql server 中有以下四種隔離級: read committed

在此隔離級下,select 命令不會返回尚未提交(committed) 的資料,也不能返回 髒資料。它是sql server 預設的隔離級。 read uncommitted

與read committed 隔離級相反,它允許讀取已經被其它使用者修改但尚未提交確 定的資料。 repeatable read

在此隔離級下,用select 命令讀取的資料在整個命令執行過程中不會被更改。此 選項會影響系統的效能,非必要情況最好不用此隔離級。 serializable

與delete 語句中serializable 選項含義相同。 隔離級需要使用set 命令來設定其語法如下:

set transaction isolation level

11.5.4 檢視鎖

可以通過企業管理器或儲存過程來檢視鎖。

(1) 用enterprise manager 檢視鎖

在企業管理器中選擇目錄樹視窗中「management」 資料夾下,「current activity」 中的「locks / process id」 節點,則可以檢視當前鎖定的程序;選擇同級的「locks / object」節點下的相應字節點,則可以檢視當前鎖定的物件,如圖11-1 所示。在圖11-1 中,右鍵單擊任務板視窗中的物件,從快捷選單中選擇「屬性」選項,則會出現如圖11-2 所示的鎖的程序細節對話方塊。在此,可以重新整理或殺死鎖的程序。

殺死程序還可以用如下transact-sql 命令來進行:

kill spid

spid 是system process id, 即系統程序編號的縮寫,如圖11-1 中所示。

圖11-2 鎖定的程序細節

(2) 用系統儲存過程sp_lock 檢視鎖

儲存過程sp_lock 的語法如下:

sp_lock spid

sql server 的程序編號spid 可以在master.dbo.sysprocesses 系統表中查到。spid 是int型別的資料,如果不指定spid ,則顯示所有的鎖。

11.5.5 死鎖及其防止

死鎖(deadlocking) 是在多使用者或多程序狀況下,為使用同一資源而產生的無法解決的爭用狀態,通俗地講,就是兩個使用者各占用乙個資源,兩人都想使用對方的資源,但同時又不願放棄自己的資源,就一直等待對方放棄資源,如果不進行外部干涉,就將一直耗下去。

死鎖會造成資源的大量浪費,甚至會使系統崩潰。在sql server 中解決死鎖的原則 是「犧牲乙個比兩個都死強」,即挑出乙個程序作為犧牲者,將其事務回滾,並向執行此 程序的程式傳送編號為1205 的錯誤資訊。而防止死鎖的途徑就是不能讓滿足死鎖條件的 情況發生,為此,使用者需要遵循以下原則:

盡量避免併發地執行涉及到修改資料的語句; 要求每個事務一次就將所有要使用的資料全部加鎖,否則就不予執行; 預先規定乙個封鎖順序所有的事務,都必須按這個順序對資料執行封鎖,例如,不同的過程在事務內部對物件的更新執行順序應盡量保持一致; 每個事務的執行時間不可太長,對程式段長的事務可考慮將其分割為幾個事務。 本章小結

本章中介紹了資料更新的方法及事務和鎖的概念。除了使用本章講述的語句更新資料外,還可以使用檢視來更新資料,有關檢視的運用請參見第13 章「游標和檢視」。

資料庫中的鎖

11.5.1 鎖的概念 鎖 lock 是在多使用者環境下對資源訪問的一種限制。機制當對乙個 11.5.1 鎖的概念 鎖 lock 是在多使用者環境下對資源訪問的一種限制。機制當對乙個資料來源加鎖後,此資料來源就有了一定的訪問限制。我們就稱對此資料來源進行了 鎖定 在sql server中,可以對以下...

資料庫中的「鎖」

資料庫當中有 鎖 這個概念,什麼叫做鎖,用咱們生活當中的事物來進行描述的話,鎖就是用來鎖門,來進行保護自己的東西的乙個物品。在資料庫當中,其實也是如此,鎖的概念就是事務訪問的乙個屏障,當乙個事務對當前系統提出加鎖的時候 加鎖的物件可以是行,表,資料庫 其他事務必須等此事務解鎖之後才能進行訪問。用生活...

資料庫中的「鎖」

資料庫當中有 鎖 這個概念,什麼叫做鎖,用咱們生活當中的事物來進行描述的話,鎖就是用來鎖門,來進行保護自己的東西的乙個物品。在資料庫當中,其實也是如此,鎖的概念就是事務訪問的乙個屏障,當乙個事務對當前系統提出加鎖的時候 加鎖的物件可以是行,表,資料庫 其他事務必須等此事務解鎖之後才能進行訪問。用生活...