乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Sql Server之旅

       咸咸咸咸魚干 2019-05-15

        終于這個系列快結束了,馬上又要過年了,沒什么心情寫博客。。。作為一個開發(fā)人員,鎖機制也是我們程序員必須掌握的東西,很久之前

      在學習鎖的時候,都是教科書上怎么說,然后我怎么背,缺少一個工具讓我們眼見為實。。。如果這樣的話,學習一個東西就很容易忘記。。。

      因為這些都是你背誦過來的。。。這篇的話我就來分享一個工具來幫助我們學習鎖。

       

      一:到底都有哪些鎖

        學習鎖之前,必須要知道鎖大概有幾種???通常情況下作為碼農(nóng)我們只需知道如下幾個鎖即可。。。

      1.S(Share)鎖

        為了方便理解,我們可以直接這么認為,當在select的時候在表,數(shù)據(jù)頁,記錄上加上共享鎖。

      2.X(Exclusive) 鎖

        我們在delete數(shù)據(jù)的時候會在記錄上附加X鎖,我們知道X鎖并不與其他的鎖兼容。如果其他的鎖與其遭遇,就會處于等待,后續(xù)我們再說。

      3.U(Update)鎖

        顧名思義,我們在Update的時候,在尋找記錄的過程中,會逐一的給記錄附加U鎖,如果找到了目標記錄的話,則會將U鎖轉(zhuǎn)化為X鎖。。。

      4.I (Intent)鎖

        這個就是所謂的意向鎖,一般都是給表和數(shù)據(jù)頁附加的鎖,好處就是防止被其他連接修改表結構。

       

      二:天下無敵的SqlServer Profile

        這個工具我想大家都明白,它的監(jiān)視能力真的是無所不能。。。鎖的痙攣狀態(tài)也全在它的掌握之中。

      1. 首先我做一個Person表,Name字段設定4000字節(jié),這樣一個數(shù)據(jù)頁可以容納2條數(shù)據(jù),如下圖:

      DROP TABLE dbo.Person
      CREATE TABLE Person(ID INT IDENTITY,NAME CHAR(4000) DEFAULT 'aaaaa')
      --插入6條,生成3個數(shù)據(jù)頁
      INSERT INTO dbo.Person DEFAULT VALUES
      go 6

       

      2. 下面我們看看數(shù)據(jù)在數(shù)據(jù)頁的分布情況。

       

      3. 然后我們開啟Profile,在“事件選擇”的Events中選擇”Lock:Acquired“和”Lock:Released“ ,然后運行,如下圖:

       

      三:使用測試數(shù)據(jù)

      1. 首先我執(zhí)行一個簡單的 SELECT * FROM dbo.Person,看看表/數(shù)據(jù)頁/記錄的加鎖情況。

      從圖中可以看到,select執(zhí)行的大概步驟如下:

      第一步:給表(Object)加上IS(意向共享鎖)。

      第二步:先給1:78號數(shù)據(jù)頁加IS鎖,掃描78號數(shù)據(jù)頁,然后釋放IS鎖。

      第三步:同樣的道理掃描之后的數(shù)據(jù)頁。

      第四步:最后釋放表的IS鎖,結束整個鎖流程。

      看完上面的一系列的Lock:Acquired 和 Lock:Released的話,你有沒有發(fā)現(xiàn)一個問題,不是說好給記錄(RID)加上S鎖么???這里沒加,

      是因為引擎進入78號數(shù)據(jù)頁的時候,未發(fā)現(xiàn)它存在IU鎖或者IX鎖。。。所以。。。這個屬于鎖的組合,后續(xù)會說。

       

      2. 接下來用UPDATE dbo.Person SET NAME='bbbbb' WHERE ID=3來看看update的整個過程,乍一看,Profile捕獲到的記錄還是比較多

        的,下面具體看圖:

       第一步: 給表(Object)加上IX鎖,

       第二步: 給數(shù)據(jù)頁(1:78)數(shù)據(jù)頁分配IU鎖。然后開始逐一掃描78號數(shù)據(jù)頁的RID記錄,進入前就Acquired,退出后就Released,當掃

            描完78號數(shù)據(jù)頁的所有RID后,再釋放78號數(shù)據(jù)頁的IU鎖,進入下一個數(shù)據(jù)頁。。。

       第三步: 我們發(fā)現(xiàn)ID=3是在89號數(shù)據(jù)頁上,當引擎掃到該RID之后,我們觀察到89號的數(shù)據(jù)頁由IU鎖變成了IX鎖,并且把1:89:0(slot

            為0的記錄)由U鎖變成X鎖,變成X鎖后,就排斥了其他所有的鎖,這時候就可以進行Update操作了。

       第四步: 后面就繼續(xù)90號數(shù)據(jù)頁,步驟類似,第二步和第三步。

      不知道細心的你有沒有發(fā)現(xiàn),在Released Object之前我們才釋放1:89:0的X鎖,然后釋放89號數(shù)據(jù)頁的IX鎖,這說明什么???說明這個

      Update是貫穿于這個事務的,不像Select操作中,掃完一個數(shù)據(jù)頁就釋放一個數(shù)據(jù)頁。

       

      3. 最后再看一個DELETE FROM dbo.Person WHERE ID=3 的操作。

        大概掃了一下上面的圖,或許你感覺和Update操作大差不差,會掃描數(shù)據(jù)頁中的每個記錄并加上U鎖。當在1:89:0槽位中找到了目

      標記錄后,然后將U鎖轉(zhuǎn)化為X鎖,具體可以參考Update。

       

      好了,最最單純的DML操作都展示給你看了...我們知道生產(chǎn)環(huán)境沒有這么簡單,但是你有此寶貝,再多動動腦子就可天下無敵了。。。

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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多