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