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 章「游標和檢視」。
MS SQL入門基礎 資料庫索引
使用者對資料庫最頻繁的操作是進行資料查詢。一般情況下,資料庫在進行查詢操作時需要對整個表進行資料搜尋。當表中的資料很多時,搜尋資料就需要很長的時間,這就造成了伺服器的資源浪費。為了提高檢索資料的能力,資料庫引入了索引機制。本章將介紹索引的概念及其建立與管理。8.1.1 索引的概念 索引是乙個單獨的 ...
MS SQL入門基礎 移動資料庫
在sql server 中可以使用拆分 detach 和附加 attach 的方法來移動資料庫。拆分資料庫是從伺服器中移去邏輯資料庫,但不會將作業系統中的資料庫檔案刪除。附加資料庫將會建立乙個新的資料庫,並複製儲存在已有的資料庫檔案和事務日誌檔案中的資料。使用系統儲存過程sp detach db 來...
MS SQL入門基礎 壓縮資料庫
資料庫在使用一段時間後,時常會出現因資料刪除而造成資料庫中空閒空間太多的情況,這時就需要減少分配給資料庫檔案和事務日誌檔案的磁碟空間,以免浪費磁碟空間。當資料庫中沒有資料時,可以修改資料庫檔案屬性直接改變其占用空間,但當資料庫中有資料時,這樣做會破壞資料庫中的資料,因此需要使用壓縮的方式來縮減資料庫...