午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

SQL鎖機(jī)制高級(jí)篇-------一

 HDTV 2009-12-18

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)。其可能性包括:

  • Rows—數(shù)據(jù)庫(kù)表中的一整行
  • Pages—行的集合(通常為幾kb)
  • Extents—通常是幾個(gè)頁(yè)的集合
  • Table—整個(gè)數(shù)據(jù)庫(kù)表
  • Database—被鎖的整個(gè)數(shù)據(jù)庫(kù)表

除非有其它的說(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從句中的例子:

[ 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 }


詞匯表
會(huì)話 (session)

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í)

鎖類型:

  • RID :行標(biāo)識(shí)符。用于在表中單獨(dú)鎖定一行。
  • KEY :鍵, 索引內(nèi)部的行鎖。用于保護(hù)可串行事務(wù)中的鍵范圍。
  • PAG :數(shù)據(jù)或索引頁(yè)。
  • EXT :相鄰的八個(gè)數(shù)據(jù)頁(yè)或索引頁(yè)構(gòu)成的一組。
  • TAB :包括所有數(shù)據(jù)和索引在內(nèi)的整個(gè)表。
  • DB :數(shù)據(jù)庫(kù)。

^_^,說(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

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. ......

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多