MS SQL入门基础:数据库中的锁
11.5.1 鎖的概念
鎖(Lock) 是在多用戶(hù)環(huán)境下對(duì)資源訪問(wèn)的一種限制。機(jī)制當(dāng)對(duì)一個(gè)數(shù)據(jù)源加鎖后,此數(shù)據(jù)源就有了一定的訪問(wèn)限制。我們就稱(chēng)對(duì)此數(shù)據(jù)源進(jìn)行了“鎖定”。在SQL Server中,可以對(duì)以下的對(duì)象進(jìn)行鎖定:
數(shù)據(jù)行(Row):數(shù)據(jù)頁(yè)中的單行數(shù)據(jù); 索引行(Key):索引頁(yè)中的單行數(shù)據(jù),即索引的鍵值; 頁(yè)(Page):頁(yè)是SQL Server 存取數(shù)據(jù)的基本單位,其大小為8KB; 盤(pán)區(qū)(Extent):一個(gè)盤(pán)區(qū)由8 個(gè)連續(xù)的頁(yè)組成; 表(Table); 數(shù)據(jù)庫(kù)(Database)。 11.5.2 鎖的類(lèi)別在SQL Server 中,鎖有兩種分類(lèi)方法。
(1) 從數(shù)據(jù)庫(kù)系統(tǒng)的角度來(lái)看
鎖分為以下三種類(lèi)型:
獨(dú)占鎖(Exclusive Lock)獨(dú)占鎖鎖定的資源只允許進(jìn)行鎖定操作的程序使用,其它任何對(duì)它的操作均不會(huì)被接受。執(zhí)行數(shù)據(jù)更新命令,即INSERT、 UPDATE 或DELETE 命令時(shí),SQL Server 會(huì)自動(dòng)使用獨(dú)占鎖。但當(dāng)對(duì)象上有其它鎖存在時(shí),無(wú)法對(duì)其加獨(dú)占鎖。獨(dú)占鎖一直到事務(wù)結(jié)束才能被釋放。 共享鎖(Shared Lock)
共享鎖鎖定的資源可以被其它用戶(hù)讀取,但其它用戶(hù)不能修改它。在SELECT 命令執(zhí)行時(shí),SQL Server 通常會(huì)對(duì)對(duì)象進(jìn)行共享鎖鎖定。通常加共享鎖的數(shù)據(jù)頁(yè)被讀取完畢后,共享鎖就會(huì)立即被釋放。 更新鎖(Update Lock)
更新鎖是為了防止死鎖而設(shè)立的。當(dāng)SQL Server 準(zhǔn)備更新數(shù)據(jù)時(shí),它首先對(duì)數(shù)據(jù)對(duì)象作更新鎖鎖定,這樣數(shù)據(jù)將不能被修改,但可以讀取。等到SQL Server 確定要進(jìn)行更新數(shù)據(jù)操作時(shí),它會(huì)自動(dòng)將更新鎖換為獨(dú)占鎖。但當(dāng)對(duì)象上有其它鎖存在時(shí),無(wú)法對(duì)其作更新鎖鎖定。
(2)從程序員的角度看鎖分為以下兩種類(lèi)型:
樂(lè)觀鎖(Optimistic Lock)樂(lè)觀鎖假定在處理數(shù)據(jù)時(shí),不需要在應(yīng)用程序的代碼中做任何事情就可以直接在記錄上加鎖、即完全依靠數(shù)據(jù)庫(kù)來(lái)管理鎖的工作。一般情況下,當(dāng)執(zhí)行事務(wù)處理時(shí)SQL Server會(huì)自動(dòng)對(duì)事務(wù)處理范圍內(nèi)更新到的表做鎖定。 悲觀鎖(Pessimistic Lock)
悲觀鎖對(duì)數(shù)據(jù)庫(kù)系統(tǒng)的自動(dòng)管理不感冒,需要程序員直接管理數(shù)據(jù)或?qū)ο笊系募渔i處理,并負(fù)責(zé)獲取、共享和放棄正在使用的數(shù)據(jù)上的任何鎖。
11.5.3 隔離級(jí)別
隔離(Isolation) 是計(jì)算機(jī)安全學(xué)中的一種概念,其本質(zhì)上是一種封鎖機(jī)制。它是指 自動(dòng)數(shù)據(jù)處理系統(tǒng)中的用戶(hù)和資源的相關(guān)牽制關(guān)系,也就是用戶(hù)和進(jìn)程彼此分開(kāi),且和操 作系統(tǒng)的保護(hù)控制也分開(kāi)來(lái)。在SQL Server 中,隔離級(jí)(Isolation Level) 是指一個(gè)事務(wù) 和其它事務(wù)的隔離程度,即指定了數(shù)據(jù)庫(kù)如何保護(hù)(鎖定)那些當(dāng)前正在被其它用戶(hù)或服 務(wù)器請(qǐng)求使用的數(shù)據(jù)。指定事務(wù)的隔離級(jí)與在SELECT 語(yǔ)句中使用鎖定選項(xiàng)來(lái)控制鎖定 方式具有相同的效果。
在SQL Server 中有以下四種隔離級(jí):
READ COMMITTED
在此隔離級(jí)下,SELECT 命令不會(huì)返回尚未提交(Committed) 的數(shù)據(jù),也不能返回臟數(shù)據(jù)。它是SQL Server 默認(rèn)的隔離級(jí)。 READ UNCOMMITTED
與READ COMMITTED 隔離級(jí)相反,它允許讀取已經(jīng)被其它用戶(hù)修改但尚未提交確定的數(shù)據(jù)。 REPEATABLE READ
在此隔離級(jí)下,用SELECT 命令讀取的數(shù)據(jù)在整個(gè)命令執(zhí)行過(guò)程中不會(huì)被更改。此選項(xiàng)會(huì)影響系統(tǒng)的效能,非必要情況最好不用此隔離級(jí)。 SERIALIZABLE
與DELETE 語(yǔ)句中SERIALIZABLE 選項(xiàng)含義相同。隔離級(jí)需要使用SET 命令來(lái)設(shè)定其語(yǔ)法如下:
SET TRANSACTION ISOLATION LEVEL
{READ COMMITTED
| READ UNCOMMITTED
| REPEATABLE READ
| SERIALIZABLE }
11.5.4 查看鎖
可以通過(guò)企業(yè)管理器或存儲(chǔ)過(guò)程來(lái)查看鎖。
(1) 用Enterprise Manager 查看鎖
在企業(yè)管理器中選擇目錄樹(shù)窗口中“Management” 文件夾下,“Current Activity” 中的“Locks / Process ID” 節(jié)點(diǎn),則可以查看當(dāng)前鎖定的進(jìn)程;選擇同級(jí)的“Locks / Object”節(jié)點(diǎn)下的相應(yīng)字節(jié)點(diǎn),則可以查看當(dāng)前鎖定的對(duì)象,如圖11-1 所示。在圖11-1 中,右鍵單擊任務(wù)板窗口中的對(duì)象,從快捷菜單中選擇“屬性”選項(xiàng),則會(huì)出現(xiàn)如圖11-2 所示的鎖的進(jìn)程細(xì)節(jié)對(duì)話(huà)框。在此,可以刷新或殺死鎖的進(jìn)程。
殺死進(jìn)程還可以用如下Transact-SQL 命令來(lái)進(jìn)行:
KILL spid
spid 是System Process ID, 即系統(tǒng)進(jìn)程編號(hào)的縮寫(xiě),如圖11-1 中所示。
圖11-2 鎖定的進(jìn)程細(xì)節(jié)
(2) 用系統(tǒng)存儲(chǔ)過(guò)程Sp_lock 查看鎖
存儲(chǔ)過(guò)程Sp_lock 的語(yǔ)法如下:
sp_lock spid
SQL Server 的進(jìn)程編號(hào)spid 可以在master.dbo.sysprocesses 系統(tǒng)表中查到。spid 是INT類(lèi)型的數(shù)據(jù),如果不指定spid ,則顯示所有的鎖。
11.5.5 死鎖及其防止
死鎖(Deadlocking) 是在多用戶(hù)或多進(jìn)程狀況下,為使用同一資源而產(chǎn)生的無(wú)法解決的爭(zhēng)用狀態(tài),通俗地講,就是兩個(gè)用戶(hù)各占用一個(gè)資源,兩人都想使用對(duì)方的資源,但同時(shí)又不愿放棄自己的資源,就一直等待對(duì)方放棄資源,如果不進(jìn)行外部干涉,就將一直耗下去。
死鎖會(huì)造成資源的大量浪費(fèi),甚至?xí)瓜到y(tǒng)崩潰。在SQL Server 中解決死鎖的原則是“犧牲一個(gè)比兩個(gè)都死強(qiáng)”,即挑出一個(gè)進(jìn)程作為犧牲者,將其事務(wù)回滾,并向執(zhí)行此進(jìn)程的程序發(fā)送編號(hào)為1205 的錯(cuò)誤信息。而防止死鎖的途徑就是不能讓滿(mǎn)足死鎖條件的情況發(fā)生,為此,用戶(hù)需要遵循以下原則:
盡量避免并發(fā)地執(zhí)行涉及到修改數(shù)據(jù)的語(yǔ)句; 要求每個(gè)事務(wù)一次就將所有要使用的數(shù)據(jù)全部加鎖,否則就不予執(zhí)行; 預(yù)先規(guī)定一個(gè)封鎖順序所有的事務(wù),都必須按這個(gè)順序?qū)?shù)據(jù)執(zhí)行封鎖,例如,不同的過(guò)程在事務(wù)內(nèi)部對(duì)對(duì)象的更新執(zhí)行順序應(yīng)盡量保持一致; 每個(gè)事務(wù)的執(zhí)行時(shí)間不可太長(zhǎng),對(duì)程序段長(zhǎng)的事務(wù)可考慮將其分割為幾個(gè)事務(wù)。 本章小結(jié)
本章中介紹了數(shù)據(jù)更新的方法及事務(wù)和鎖的概念。除了使用本章講述的語(yǔ)句更新數(shù)據(jù)外,還可以使用視圖來(lái)更新數(shù)據(jù),有關(guān)視圖的運(yùn)用請(qǐng)參見(jiàn)第13 章“游標(biāo)和視圖”。
總結(jié)
以上是生活随笔為你收集整理的MS SQL入门基础:数据库中的锁的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 摩米士推出精英 100W 车载充电器:2
- 下一篇: linux cmake编译源码,linu