成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SQL Server 2008中SQL應(yīng)用之二“鎖定(locking)”

數(shù)據(jù)庫 SQL Server
鎖是關(guān)系型數(shù)據(jù)庫系統(tǒng)中的常規(guī)和必要的一部分。那么在SQL中鎖是什么樣子的?如何查看鎖得活動(dòng)?怎么控制表的鎖升級行為?在下文中筆者會為我們一一做出解答。

一、鎖的基本概念:

鎖定(Locking)是一個(gè)關(guān)系型數(shù)據(jù)庫系統(tǒng)的常規(guī)和必要的一部分,它防止對相同數(shù)據(jù)作 并發(fā)更新 或在更新過程中查看數(shù)據(jù), 從而保證被更新數(shù)據(jù)的完整性。它也能防止用戶讀取正在被修改的數(shù)據(jù) 。Sql Server動(dòng)態(tài)地管理鎖定,然而,還是很有必要了解Transact- SQL查詢?nèi)绾斡绊慡QL Server中的鎖定。在此,簡單介紹下鎖的基本常識。

鎖定有助于防止并發(fā)問題的發(fā)生。當(dāng)一個(gè)用戶試圖讀取另一個(gè)用戶正在修改的數(shù)據(jù),或者修改另一個(gè)用戶正在讀取的數(shù)據(jù)時(shí),或者嘗試修改另一個(gè)事務(wù)正在嘗試修改的數(shù)據(jù)時(shí),就會出現(xiàn)并發(fā)問題。

SQL Server資源會被鎖定,資源的鎖定方式稱作它的鎖定模式(lock mode),下表列出SQL Server處理的主要鎖定模式:

名稱       描述
共享 (S)  用于不更改或不更新數(shù)據(jù)的讀取操作,如 SELECT 語句。  
更新 (U)     用于可更新的資源中。 防止當(dāng)多個(gè)會話在讀取、鎖定以及隨后可能進(jìn)行的資源更新時(shí)發(fā)生常見形式的死鎖。 
排他 (X)      用于數(shù)據(jù)修改操作,例如 INSERT、UPDATE 或 DELETE。 確保不會同時(shí)對同一資源進(jìn)行多重更新。
意向   用于建立鎖的層次結(jié)構(gòu)。 意向鎖包含三種類型:意向共享 (IS)、意向排他 (IX) 和意向排他共享 (SIX)。  
架構(gòu)   在執(zhí)行依賴于表架構(gòu)的操作時(shí)使用。 架構(gòu)鎖包含兩種類型:架構(gòu)修改 (Sch-M) 和架構(gòu)穩(wěn)定性 (Sch-S)。  
大容量更新 (BU)    在向表進(jìn)行大容量數(shù)據(jù)復(fù)制且指定了TABLOCK 提示時(shí)使用。  
 
鍵范圍    當(dāng)使用可序列化事務(wù)隔離級別時(shí)保護(hù)查詢讀取的行的范圍。 確保再次運(yùn)行查詢時(shí)其他事務(wù)無法插入符合可序列化事務(wù)的查詢的行。

可以鎖定SQL Server中的各種對象,既可以是一個(gè)行,也可以是一個(gè)表或數(shù)據(jù)庫。可以鎖定的資源在粒度(granularity)上差異很大。從細(xì)(行)到粗(數(shù)據(jù)庫)。細(xì)粒度鎖允許更大的數(shù)據(jù)庫并發(fā),因?yàn)橛脩裟軐δ承┪存i定的行執(zhí)行查詢。然而,每個(gè)由SQL Server產(chǎn)生的鎖都需要內(nèi)存,所以數(shù)以千計(jì)獨(dú)立的行級別的鎖也會影響SQL Server的性能。粗粒度的鎖降低了并發(fā)性,但消耗的資源也較少。下表介紹SQL Server可以鎖定的資源:

資源 說明
 KEY  索引中用于保護(hù)可序列化事務(wù)中的鍵范圍的行鎖。 
PAGE 數(shù)據(jù)庫中的 8 KB 頁,例如數(shù)據(jù)頁或索引頁。
EXTENT 一組連續(xù)的八頁,例如數(shù)據(jù)頁或索引頁。
HoBT  堆或B 樹。 用于保護(hù)沒有聚集索引的表中的 B 樹(索引)或堆數(shù)據(jù)頁的鎖。
TABLE  包括所有數(shù)據(jù)和索引的整個(gè)表。
FILE  數(shù)據(jù)庫文件。
RID   用于鎖定堆中的單個(gè)行的行標(biāo)識符。
APPLICATION  應(yīng)用程序?qū)S玫馁Y源。
METADATA   元數(shù)據(jù)鎖。 
ALLOCATION_UNIT 分配單元。
DATABASE  整個(gè)數(shù)據(jù)庫。

不是所有的鎖都能彼此兼容。例如,一個(gè)被排他鎖鎖定的資源不能被再加其他鎖。其他事務(wù)必須等待或超時(shí),直到排他鎖被釋放。被更新鎖鎖定的資源只能接受其他事務(wù)的共享鎖。被共享鎖鎖定的資源還能接受其他的共享鎖或更新鎖。

SQL Server自動(dòng)分配和升級鎖。升級意味著細(xì)粒度的鎖(行或頁鎖)被轉(zhuǎn)化為粗粒度的表鎖。當(dāng)單個(gè)T-SQL語句在單個(gè)表或索引上獲取5000多個(gè)鎖,或者SQL Server實(shí)例中的鎖數(shù)量超過可用內(nèi)存閾值時(shí),SQL Server會嘗試啟動(dòng)鎖升級。鎖占用系統(tǒng)內(nèi)存,因此把很多鎖轉(zhuǎn)化為一個(gè)較大的鎖能釋放內(nèi)存資源。然而,在釋放內(nèi)存資源的同時(shí)會降低并發(fā)性。

SQL Server 2008帶來了新的表選項(xiàng),可以禁用鎖升級或在分區(qū)(而不是表)范圍啟用鎖升級。

二、查看鎖的活動(dòng)

下面演示一個(gè)實(shí)例,它使用sys.dm_tran_locks動(dòng)態(tài)視圖監(jiān)視數(shù)據(jù)庫中鎖的活動(dòng)。

打開一個(gè)查詢窗口,執(zhí)行如下語句:

  1. USE AdventureWorks  
  2. BEGIN TRAN  
  3. SELECT ProductID, ModifiedDate  
  4. FROM Production.ProductDocument  
  5. WITH (TABLOCKX) 

打開另一個(gè)查詢窗口,執(zhí)行:

  1. SELECT request_session_id sessionid,  
  2. resource_type type,  
  3. resource_database_id dbid,  
  4. OBJECT_NAME(resource_associated_entity_id,   
  5. resource_database_id) objectname,  
  6. request_mode rmode,  
  7. request_status rstatus  
  8. FROM sys.dm_tran_locks  
  9. WHERE resource_type IN ('DATABASE''OBJECT'

執(zhí)行結(jié)果:

  1. /*sessionid    type    dbid    objectname    rmode    rstatus  
  2.      51      DATABASE    4        NULL         S       GRANT 
  3.      52      DATABASE    4        NULL         S       GRANT 
  4.      53      DATABASE    8        NULL         S       GRANT   
  5.      56      DATABASE    8        NULL         S       GRANT 
  6.      53      OBJECT      8    ProductDocument  X       GRANT 
  7. */  
  8.  

解析:本示例中,我們首先啟動(dòng)了一個(gè)新事務(wù),并使用TABLOCKX鎖提示(這個(gè)提示對表放置了排他鎖),對Production.ProductDocument表執(zhí)行了一個(gè)查詢。查詢sys.dm_tran_locks動(dòng)態(tài)管理視力可以監(jiān)視當(dāng)前SQL Server實(shí)例中打開了哪些鎖。它返回了AdventureWorks數(shù)據(jù)庫中活動(dòng)鎖的列表。可以在結(jié)果中的***一行看到ProductDocument表上的排他鎖。

前三列定義了會話鎖、資源類型和數(shù)據(jù)庫ID。第四列使用了Object_Name函數(shù),注意它使用了兩個(gè)參數(shù)(對象ID和數(shù)據(jù)庫ID)來指定訪問哪個(gè)名稱(第二個(gè)參數(shù)是SQL Server 2005 SP2引入的,它用來指定為了轉(zhuǎn)換對象名稱而使用哪個(gè)數(shù)據(jù)庫)。同時(shí)也查詢鎖定請求模式和狀態(tài),***,F(xiàn)rom子句引用DMV,用Where子句指定了兩個(gè)資源類型。Resource_Type指定了鎖定的資源類型,如Database\Object\File\Page\Key\RID\Extent\Metadata\Application\Allocation_Unit或HOBT類型。依賴資源類型的resource_associated_entity_id,確定ID是object ID, allocation unit ID, 或Hobt ID。

如果resource_associated_entity_id列包含Object ID(資源類型為Object),可以使用sys.objects目錄視圖來轉(zhuǎn)換名稱。

如果resource_associated_entity_id列包含allocation unit ID(資源類型為Allocation_Unit),可以引用sys.allocatiion_units和contain_id聯(lián)結(jié)到sys.partitions上,就可以確定object ID。

如果resource_associated_entity_id列包含Hobt ID(資源類型為Key\page\Row或HOBT),可以直接引用sys.partitions,然后查找相應(yīng)的Object ID。

對于Database、Extent、 Application或MetaData的資源類型,resource_associated_entity_id列將為0。

使用sys.dm_tran_locks能對無法預(yù)料的并發(fā)問題進(jìn)行故障調(diào)試。例如,一個(gè)查詢會話占用鎖的時(shí)間可能比預(yù)期時(shí)間長而被鎖,或者鎖的粒度或鎖模式不是我們所期望的(可能是希望使用表鎖而不是更小粒度的行鎖或頁鎖)。理解鎖處于的鎖定級別有助于我們更有效地對查詢的并發(fā)問題進(jìn)行故障調(diào)試。

三、控制表的鎖升級行為

每個(gè)在SQL Server中創(chuàng)建的鎖都會消耗內(nèi)存資源。當(dāng)鎖的數(shù)量增加時(shí),內(nèi)存就會減少。如果鎖的內(nèi)存使用百分比超過一個(gè)特定閾值,SQL Server會將細(xì)粒度鎖(頁或行)轉(zhuǎn)換為粗粒度鎖(表鎖)。這個(gè)過程稱為鎖升級。鎖升級可以減少SQL Server實(shí)例占有的鎖數(shù)量,減少鎖內(nèi)存的使用。

雖然細(xì)粒度會消耗更多的內(nèi)存,但由于多個(gè)查詢可以訪問未鎖定的行,因此也會改善并發(fā)性。引入表鎖可能會減少內(nèi)存的消耗,但也會帶來阻塞,這是因?yàn)橐粭l查詢鎖住了整個(gè)表。根據(jù)使用數(shù)據(jù)庫的應(yīng)用程序,這個(gè)行為可能是不希望發(fā)生的,而且你可能希望當(dāng)SQL Server實(shí)施鎖升級時(shí)盡量獲得更多的控制。

SQL Server 2008引入了使用ALter table命令在表級別控制鎖升級的功能。現(xiàn)在可以從如下3個(gè)設(shè)置中選擇:

Table 這是SQL Server 2005中使用的默認(rèn)行為。當(dāng)設(shè)置為該值時(shí),在表級別啟用了鎖升級,不論是否為分區(qū)表。

Auto 如果表已分區(qū),則在分區(qū)級別(堆或B樹)啟用鎖升級。如果表未分區(qū),鎖升級將發(fā)生在表級別上。

Disable 在表級別刪除鎖升級。注意,對于用了TABLOCK 提示或使用可序列化隔離級別下Heap的查詢時(shí),你仍然可能看到表鎖。

下面示例演示了修改表的新設(shè)置:

  1. ALTER TABLE Person.Address  
  2. SET (LOCK_ESCALATION = AUTO)--注意這句在SQL Server 2005下會出錯(cuò)  
  3. SELECT lock_escalation,lock_escalation_desc  
  4. FROM sys.tables  
  5. WHERE name='Address' 
  6.  
  7. /*lock_escalation    lock_escalation_desc  
  8. 2    AUTO  
  9. */ 

下來,我們禁用鎖升級:

  1. ALTER TABLE Person.Address  
  2. SET ( LOCK_ESCALATION = DISABLE)  
  3. SELECT lock_escalation,lock_escalation_desc  
  4. FROM sys.tables  
  5. WHERE name='Address' 
  6.  
  7. /*lock_escalation    lock_escalation_desc  
  8. 1    DISABLE  
  9. */ 

說明:在更改了這個(gè)配置后,可以通過查詢sys.tables目錄視圖的lock_escalation_desc列來驗(yàn)證這個(gè)選項(xiàng)。

 原文出處:http://www.cnblogs.com/downmoon/archive/2011/02/18/1916117.html

【編輯推薦】

  1. SQL Server 2008中SQL應(yīng)用之一“死鎖(Deadlocking)”
  2. 淺析SQL Server 2008中的代碼安全之一:存儲過程加密與安全上下文
  3. 淺析SQL Server 2008中的代碼安全之二:DDL觸發(fā)器與登錄觸發(fā)器
  4. 淺析SQL Server 2008中的代碼安全之三:通過PassPhrase加密
  5. 淺析SQL Server 2008中的代碼安全之四:主密鑰 
責(zé)任編輯:艾婧 來源: 博客園
相關(guān)推薦

2011-03-11 13:26:32

SQL ServerBlocking阻塞

2011-02-28 13:19:50

SQL Server SQL死鎖

2011-08-19 14:38:22

SQL Server 2008遞歸查詢

2011-08-19 14:03:36

SQL Server 檢索集合

2011-08-19 13:46:22

SQL Server 組裝有序集合

2011-02-18 17:31:18

SQL Server

2011-09-01 13:24:42

SQL Server 呈現(xiàn)GeoRSS訂閱的Bing Maps

2009-04-16 18:15:19

動(dòng)作審核審核活動(dòng)SQL Server

2009-04-16 17:44:31

2009-04-16 17:03:12

報(bào)表開發(fā)工具報(bào)表制作SQL Server

2011-08-19 10:13:34

SQL Server Values新用途

2011-08-19 10:24:46

SQL Server Top新用途

2011-08-19 11:00:54

SQL Server WaitFor命令

2013-03-13 09:53:50

SQL Server

2011-08-19 10:40:27

SQL Server Merge命令

2010-11-12 13:08:36

動(dòng)態(tài)sql語句

2009-04-16 17:55:15

擴(kuò)展熱插拔SQL Server

2009-04-16 17:11:39

管理報(bào)表配置報(bào)表SQL Server

2011-03-24 10:19:58

SQL Server2CPU性能監(jiān)控

2009-06-22 10:22:57

SQL Server
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产成人综合在线 | 国产一区二区三区 | 国产精品国产三级国产aⅴ入口 | 日本激情视频中文字幕 | 激情欧美日韩一区二区 | 福利片在线观看 | 人人鲁人人莫人人爱精品 | 欧美色欧美亚洲另类七区 | 91精品国产麻豆 | 久久久这里只有17精品 | 日韩视频专区 | 午夜爽爽爽男女免费观看 | 精品久久国产 | 日韩精品在线网站 | 国产黄视频在线播放 | 国产综合精品 | 国产高清亚洲 | 国产精品视频入口 | 黄色毛片免费 | 国产在线a | 久久精品免费一区二区 | 宅男噜噜噜66一区二区 | 国产精品视频在线播放 | 日韩中文视频 | 99成人免费视频 | av网站在线免费观看 | 国产国拍亚洲精品av | 亚洲精品成人 | 欧美a在线看 | av电影一区二区 | 999国产视频 | 欧美a免费 | 国产乱码精品1区2区3区 | 国产精品视频网站 | 亚洲久在线| 麻豆国产一区二区三区四区 | 久久精品国产亚洲一区二区三区 | 日韩三区| 久久久精品一区二区三区 | 国产视频1区2区 | 国产小u女发育末成年 |