SQL鎖機(jī)制高級(jí)篇-------一在看這篇文章(翻譯)之前,簡(jiǎn)單介紹一下鎖,順便也帶出幾個(gè)專用詞匯的翻譯。
SQL Server 2000使用鎖來(lái)實(shí)現(xiàn)多用戶同時(shí)修改數(shù)據(jù)庫(kù)同一數(shù)據(jù)時(shí)的同步控制。
多個(gè)會(huì)話同時(shí)訪問(wèn)數(shù)據(jù)庫(kù)一些資源時(shí),當(dāng)每個(gè)會(huì)話都需要?jiǎng)e的會(huì)話正在使用的資源時(shí),死鎖就有可能發(fā)生。死鎖在多線程系統(tǒng)中都有可能出現(xiàn),并不僅僅局限于于關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)。
一個(gè)數(shù)據(jù)庫(kù)系統(tǒng)在許多情況下都有可能鎖數(shù)據(jù)項(xiàng)。其可能性包括:
除非有其它的說(shuō)明,數(shù)據(jù)庫(kù)根據(jù)情況自己選擇最好的鎖方式。不過(guò)值得感謝的是,SQL Server提供了一種避免默認(rèn)行為的方法。這是由鎖提示來(lái)完成的。
Tansact-SQL提供了一系列不同級(jí)別的鎖提示,你可以在SELECT,INSERT,UPDATE和DELETE中使用它們來(lái)告訴SQL Server你需要如何通過(guò)重設(shè)鎖??梢詫?shí)現(xiàn)的提示包括: · FASTFIRSTROW—選取結(jié)果集中的第一行,并將其優(yōu)化 · HOLDLOCK—持有一個(gè)共享鎖直至事務(wù)完成 · NOLOCK—不允許使用共享鎖或獨(dú)享鎖。這可能會(huì)造成數(shù)據(jù)重寫或者沒(méi)有被確認(rèn)就返回的情況; 因此,就有可能使用到臟數(shù)據(jù)。這個(gè)提示只能在SELECT中使用。 · PAGLOCK—鎖表格 · READCOMMITTED—只讀取被事務(wù)確認(rèn)的數(shù)據(jù)。這就是SQL Server的默認(rèn)行為。 · READPAST—跳過(guò)被其它進(jìn)程鎖住的行,所以返回的數(shù)據(jù)可能會(huì)忽略行的內(nèi)容。這也只能在SELECT中使用。 · READUNCOMMITTED—等價(jià)于NOLOCK. · REPEATABLEREAD—在查詢語(yǔ)句中,對(duì)所有數(shù)據(jù)使用鎖。這可以防止其它的用戶更新數(shù)據(jù), 但是新的行可能被其它的用戶插入到數(shù)據(jù)中,并且被最新訪問(wèn)該數(shù)據(jù)的用戶讀取。 · ROWLOCK—按照行的級(jí)別來(lái)對(duì)數(shù)據(jù)上鎖。SQL Server通常鎖到頁(yè)或者表級(jí)別來(lái)修改行, 所以當(dāng)開發(fā)者使用單行的時(shí)候,通常要重設(shè)這個(gè)設(shè)置。 · SERIALIZABLE—等價(jià)于HOLDLOCK. · TABLOCK—按照表級(jí)別上鎖。在運(yùn)行多個(gè)有關(guān)表級(jí)別數(shù)據(jù)操作的時(shí)候,你可能需要使用到這個(gè)提示。 · UPDLOCK—當(dāng)讀取一個(gè)表的時(shí)候,使用更新鎖來(lái)代替共享鎖,并且保持一直擁有這個(gè)鎖直至事務(wù)結(jié)束。 它的好處是,可以允許你在閱讀數(shù)據(jù)的時(shí)候可以不需要鎖,并且以最快的速度更新數(shù)據(jù)。 · XLOCK—給所有的資源都上獨(dú)享鎖,直至事務(wù)結(jié)束。 微軟將提示分為兩類:granularity和isolation-level。Granularity提示包括PAGLOCK, NOLOCK, ROWLOCK和TABLOCK。而isolation-level提示包括HOLDLOCK, NOLOCK, READCOMMITTED, REPEATABLEREAD和SERIALIZABLE。 可以在Transact-SQL聲明中使用這些提示。它們被放在聲明的FROM部分中,位于WITH之后。WITH聲明在SQL Server 2000中是可選部分,但是微軟強(qiáng)烈要求將它包含在內(nèi)。這就使得許多人都認(rèn)為在未來(lái)的SQL Server發(fā)行版中,就可能會(huì)包含這個(gè)聲明。下面是提示應(yīng)用于FROM從句中的例子: English Query 中由 English Query 引擎執(zhí)行的操作序列。會(huì)話在用戶登錄時(shí)開始,在用戶注銷時(shí)結(jié)束。 會(huì)話期間的所有操作構(gòu)成一個(gè)事務(wù)作用域,并受由登錄用戶名和密碼決定的權(quán)限的支配。 堆表 (heap table) 如果一個(gè)表沒(méi)有索引,數(shù)據(jù)行以隨機(jī)的順序存儲(chǔ),這種結(jié)構(gòu)稱為堆。這種表稱為堆表。 意向鎖 (intent lock) 放置在資源層次結(jié)構(gòu)的一個(gè)級(jí)別上的鎖,以保護(hù)較低級(jí)別資源上的共享或排它鎖。例如,在 SQL Server 2000 數(shù)據(jù)庫(kù)引擎任務(wù)應(yīng)用表內(nèi)的共享或排它行鎖之前,在該表上放置意向鎖。如果另一個(gè)任務(wù)試圖在該表級(jí)別上應(yīng)用共享或排它鎖,則受到由第一個(gè)任務(wù)控制的表級(jí)別意向鎖的阻塞。第二個(gè)任務(wù)在鎖定該表前不必檢查各個(gè)頁(yè)或行鎖,而只需檢查表上的意向鎖。 排它鎖(exclusive lock) 一種鎖,它防止任何其它事務(wù)獲取資源上的鎖,直到在事務(wù)的末尾將資源上的原始鎖釋放為止。在更新操作(INSERT、UPDATE 或 DELETE)過(guò)程中始終應(yīng)用排它鎖。 隔離級(jí)別 (isolation level) 控制隔離數(shù)據(jù)以供一個(gè)進(jìn)程使用并防止其它進(jìn)程干擾的程度的事務(wù)屬性。設(shè)置隔離級(jí)別定義了 SQL Server 會(huì)話中所有 SELECT 語(yǔ)句的默認(rèn)鎖定行為。 擴(kuò)展 (extent) 每當(dāng) SQL Server 對(duì)象(如表或索引)需要更多空間時(shí)分配給該對(duì)象的空間的單元。在 SQL Server 2000 中,一個(gè)擴(kuò)展是八個(gè)鄰接的頁(yè)。 鎖粒度(lock granularity) SQL Server中數(shù)據(jù)以8KB為一頁(yè)(page)的單位保存,連續(xù)的8個(gè)頁(yè)組成一個(gè)擴(kuò)展(extent)。創(chuàng)建數(shù)據(jù)庫(kù)時(shí), 按這種方式來(lái)分配磁盤空間。當(dāng)數(shù)據(jù)庫(kù)容量增加時(shí),意味著要?jiǎng)?chuàng)建更多的頁(yè)和擴(kuò)展。按照數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu) (row,page,extent)進(jìn)行加鎖,就是鎖粒度。 SQL Server 2000里,最低的鎖粒度是行(row)鎖。SQL Server可以單獨(dú)鎖行,數(shù)據(jù)頁(yè),擴(kuò)展,表。 假設(shè)在UPDATE操作中只影響一行記錄,SQL Server會(huì)將該行記錄鎖定,其他用戶只有等該行記錄的 更新操作完畢后才能修改。另一方面,對(duì)于沒(méi)有鎖定的行記錄,其他用戶是可以進(jìn)行修改的。 因此行級(jí)鎖對(duì)于并發(fā)是最佳的。 現(xiàn)在假設(shè)UPDATE操作影響1000行記錄,SQL Server是否一次鎖定一行?那就意味著如果有一個(gè)這樣的選項(xiàng),在 內(nèi)存允許前提下,需要1000個(gè)鎖。實(shí)際上,SQL Server會(huì)根據(jù)這些數(shù)據(jù)是否分布在連續(xù)的頁(yè),來(lái)決定是否用幾個(gè)頁(yè)面鎖,或者擴(kuò)展鎖,或者是表鎖。如果SQL Server加了頁(yè)面鎖,那么這些頁(yè)面上的記錄其它用戶就無(wú)法 訪問(wèn)或者修改,即使頁(yè)面上有些數(shù)據(jù)并非屬于這1000行記錄。這就是一種追求并發(fā)性能和資源消耗之間的平衡策略。 SQL Server對(duì)鎖需要的資源十分敏感,也就是說(shuō),SQL Server查詢優(yōu)化器檢測(cè)到可用內(nèi)存較低時(shí),就會(huì)使用頁(yè)鎖來(lái) 替代多個(gè)行鎖。同樣,在內(nèi)存消耗更低的判斷下,會(huì)優(yōu)先選擇表鎖而幾個(gè)擴(kuò)展鎖。 鎖信息的標(biāo)識(shí) 鎖類型:
^_^,說(shuō)是簡(jiǎn)單介紹,其實(shí)我覺(jué)得已經(jīng)對(duì)鎖介紹也蠻多了,也許有寫得不對(duì)的地方,有心人幫忙指點(diǎn)一下。詞匯的中文翻譯是從SQL Server聯(lián)機(jī)幫助(books online)上搬用的。下面開始正文,好歹人家也是發(fā)表在堂堂DBA大網(wǎng)站上的Article,呵呵。
文章來(lái)源:SQL-Server-Performance.com Advanced SQL Server Locking |
|