<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      擦亮自己的眼睛去看SQLServer之談?wù)勬i機(jī)制

              在談?wù)凷QLServer的鎖機(jī)制之前,來思考以下這個(gè)場(chǎng)景:當(dāng)你在酷暑的時(shí)候騎著自己的小車往目的地行走時(shí),路上連續(xù)遇到幾個(gè)時(shí)間很長(zhǎng)的紅燈,是不是很郁悶?有時(shí)候你可能實(shí)在受不了闖了個(gè)紅燈,其實(shí)在大部分情況下問題不大,如果通行的汽車很多那就不好說了。因?yàn)椴蛔袷匾?guī)則的人太多,都為了達(dá)到目的去走捷徑,不愿意等待。這樣才有了交警。交警的作用就是維護(hù)這些紅綠燈的規(guī)則。這些紅綠燈就像鎖一樣,鎖住或延長(zhǎng)你去目的地的時(shí)間。但是如果沒有交警大家又不自由遵守紅綠燈規(guī)則會(huì)導(dǎo)致什么呢?大家想想都知道。

              這個(gè)系列的一篇文章中提供的事務(wù)管理器中有個(gè)鎖管理器就是這里的交警。它維護(hù)著SQLServer中的鎖。前段提到的大部分情況指的就是在系統(tǒng)事務(wù)量不大的時(shí)候,這時(shí)候的鎖永遠(yuǎn)不會(huì)是什么大問題。除非你知道你的系統(tǒng)永遠(yuǎn)就給幾個(gè)人用,否則考慮到避免系統(tǒng)以后的并發(fā)量上升引起數(shù)據(jù)安全與效率問題,那你得深入了解鎖機(jī)制。在研究鎖之前,假定你已經(jīng)了解事務(wù)的ACID概念,它是整個(gè)SQLServer的精髓所在。如果沒有事務(wù)那就不用談鎖了,除了事務(wù)需要鎖以外其他任何東西都需要這個(gè)讓SQL不自由的機(jī)制。說到底鎖是一個(gè)平衡并發(fā)與數(shù)據(jù)安全的機(jī)制,如果沒有鎖,任何SQL都能覆蓋其他SQL執(zhí)行的數(shù)據(jù),那么數(shù)據(jù)會(huì)出現(xiàn)不一致的情況。如果鎖得太狠,那將影響數(shù)據(jù)庫系統(tǒng)的并發(fā)性以及效率(包括鎖本身帶來的額外開銷)。這時(shí)候就需要去權(quán)衡,SQLServer鎖管理器就充當(dāng)權(quán)衡這兩者關(guān)系的角色,如下圖所示:

                    

              SQLServer中鎖的知識(shí)點(diǎn)實(shí)在太多,比如鎖從模式上分為:共享鎖(S)、更新鎖(U)、排他鎖(X)、架構(gòu)鎖(Sch-S、Sch-M)、意向鎖(IS、IU、IX)、轉(zhuǎn)換鎖(SIX、SIU、UIX)、大容量更新鎖(BU);鎖從粒度上分為:數(shù)據(jù)庫鎖、文件鎖、表鎖、堆鎖、索引鎖、頁鎖、鍵鎖、區(qū)鎖、行鎖、應(yīng)用程序鎖、元數(shù)據(jù)鎖;鎖之間存在兼容性問題;鎖會(huì)根據(jù)情況進(jìn)行升級(jí);鎖控制不好會(huì)出現(xiàn)死鎖;悲觀鎖的隔離性:未提交讀、已提交讀、可重復(fù)讀、可序列化;樂觀鎖的隔離性:讀提交快照隔離、快照隔離;閂(shuan)鎖。。。隨便列下就一大堆問題要說清楚需要花很大篇幅。還是抱著與前幾篇文章的風(fēng)格,仔細(xì)分析一個(gè)具體的問題——鎖升級(jí)。

              1、準(zhǔn)備

               有一個(gè)動(dòng)態(tài)管理視圖可以查看所有鎖:sys.dm_tran_locks,還有一個(gè)動(dòng)態(tài)管理視圖可以查看哪些請(qǐng)求正在阻塞其他的請(qǐng)求:sys.dm_os_waiting_tasks

              2、什么是鎖升級(jí)

               鎖升級(jí)是指鎖的粒度由細(xì)向粗轉(zhuǎn)換。如:由行鎖轉(zhuǎn)成表鎖。

              3、需要鎖升級(jí)嗎?

              一般來說,鎖的粒度越小,并發(fā)性越好但是如果去鎖定的東西多就需要的鎖越多,這樣會(huì)消耗SQLServer的cpu與內(nèi)存。一個(gè)鎖占用內(nèi)存約為96字節(jié),你算算如果用行鎖去鎖定百萬千萬的表需要多少內(nèi)存。而且管理鎖(創(chuàng)建鎖、維護(hù)鎖、銷毀鎖等)也是有代價(jià)的,會(huì)消耗cpu。 如果用一個(gè)大點(diǎn)的鎖就將這些百萬千萬的鎖合并成一個(gè)鎖了,管理起來也方便消耗資源也小。

              4、什么時(shí)候出現(xiàn)鎖升級(jí)

               SQLServer意識(shí)到鎖定的頁面或行數(shù)過大的時(shí)候發(fā)生。怎么意識(shí)到過大呢?由兩種方法識(shí)別:請(qǐng)求用于的鎖的數(shù)目超過鎖數(shù)目臨界值;鎖管理器為單獨(dú)一個(gè)查詢消耗過多的內(nèi)存超過內(nèi)存臨界值。有其他一個(gè)超過臨界值,SQLServer就會(huì)試圖升級(jí)。注意這里說的鎖數(shù)據(jù)以及內(nèi)存是值由同一個(gè)查詢發(fā)生的,而不是總共的。這里說的臨界值并不是固定的,SQLServer采用啟發(fā)式算法去動(dòng)態(tài)調(diào)整。

              5、控制鎖升級(jí)

               SQLServer提供一些可以讓我們控制鎖升級(jí)的入口。在SQLServer2008中可以通過:

               alter table test

               set (lock_escalation = auto|table|disable)

               我們還可以通過在代碼中顯示指定pagelock、tablock提示,會(huì)強(qiáng)制SQLServer使用更粗的鎖。不過這個(gè)設(shè)置不合理的話會(huì)導(dǎo)致并發(fā)降低。建議一般情況下不用,除非你很清楚這樣帶來的影響。

              6、舉例說明 

              6.1建庫建表:

              create database Test

              create table test

              (
                   ID identity(1,1) primary key,
                   [Name] varchar(50) not null default '',
                   CreatedTime datetime not null default getdate();
               )

              查看當(dāng)前鎖情況:

               

              默認(rèn)某個(gè)連接對(duì)整個(gè)數(shù)據(jù)庫有個(gè)共享鎖。

              6.2循環(huán)插入幾十萬條記錄:

              while 1 = 1

              insert into test(Name) values ('kk')

              插入時(shí)的鎖快照 :

              

              從上圖中看出這個(gè)快照中有:三個(gè)數(shù)據(jù)庫共享鎖、一個(gè)頁級(jí)意向排他鎖、一個(gè)表級(jí)意向排他鎖、兩個(gè)行級(jí)排他鎖。

              三個(gè)數(shù)據(jù)庫共享鎖:前面已經(jīng)提過,默認(rèn)某個(gè)連接對(duì)整個(gè)數(shù)據(jù)庫有個(gè)共享鎖;

              一個(gè)頁級(jí)意向排他鎖、一個(gè)表級(jí)意向排他鎖:在頁以及表級(jí)表示資源的一部分實(shí)際已經(jīng)有鎖進(jìn)行保護(hù),這樣的好處允許其他請(qǐng)求鎖在表頁級(jí)別上進(jìn)行檢查,減少不必要的更細(xì)的鎖請(qǐng)求,提高性能。比如在這種情況下,如果允許alter操作那么這個(gè)操作就會(huì)等待因?yàn)檫@里有表級(jí)排他鎖,它提示alter操作該表有活動(dòng)。

             6.3 跟蹤Lock:Escalation事件

              在profiler中設(shè)置只跟蹤Lock:Escalation事件,鎖升級(jí)事件。

             6.4更新表中記錄:

               update test set name = 'name' where name = 'kk'

               在profiler中看到了Lock:Escalation事件被觸發(fā):

              更新時(shí)的快照為(按順序):

       

                 如上圖:此時(shí)update操作以排他鎖定它更新的行。

                 

                  如上圖:此時(shí)update操作以排他鎖鎖定了整個(gè)表,以架構(gòu)穩(wěn)定鎖(Sch-S)鎖定它相關(guān)的元數(shù)據(jù)表。

                 如上圖:此時(shí)釋放了對(duì)元數(shù)據(jù)表的架構(gòu)穩(wěn)定鎖(Sch-S)鎖,剩下對(duì)整個(gè)表的排他鎖。

                 從上面的分析中,發(fā)現(xiàn)SQLServer鎖機(jī)制是有點(diǎn)復(fù)雜的,不過也是很有意思的。研究后,你會(huì)發(fā)現(xiàn)它真的很智能。今天分析就到此結(jié)束,文中如有描述不當(dāng)?shù)牡胤剑瑲g迎指出。共同進(jìn)步才是硬道理。

      posted @ 2011-08-14 19:55  小軍人  閱讀(9206)  評(píng)論(24)    收藏  舉報(bào)
      主站蜘蛛池模板: 91人妻无码成人精品一区91| 香港经典a毛片免费观看播放| 国产日韩精品欧美一区喷水| 午夜福利国产精品小视频| 熟女少妇精品一区二区| 欧美颜射内射中出口爆在线| 久久综合亚洲色一区二区三区| 亚洲成年av天堂动漫网站| 免费无码肉片在线观看| 99精品免费久久久久久久久日本| 日韩精品国产中文字幕| 特级做a爰片毛片免费看无码| 麻豆a级片| 午夜亚洲www湿好爽| 成人午夜无人区一区二区| 国产免费又黄又爽又色毛| 精品黄色av一区二区三区 | 欧美熟妇乱子伦XX视频| 丰满人妻无码∧v区视频| 99在线视频免费观看| 亚在线观看免费视频入口| 亚洲高清日韩heyzo| 久久精品人妻无码一区二区三区| 久久精品熟妇丰满人妻久久 | 福利一区二区1000| 日韩美女亚洲性一区二区| 亚洲AV无码专区亚洲AV紧身裤| 亚洲精品日韩中文字幕| 国产一级特黄高清大片一| 久操线在视频在线观看| 亚洲精品无码高潮喷水A| 亚洲精品成人久久久| www插插插无码免费视频网站| 久久国产精品不只是精品| 国产成人亚洲精品青草天美| 色天天天综合网色天天| 四虎影视国产精品永久在线| 一本色道久久东京热| 最新亚洲人成网站在线观看| 久久人人妻人人爽人人爽| 成人免费xxxxx在线观看|