1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        關(guān)于數(shù)據(jù)庫事務(wù)、隔離級(jí)別、鎖的理解與整理

        共 3762字,需瀏覽 8分鐘

         ·

        2021-08-09 00:31

        下方查看歷史精選文章

        重磅發(fā)布 - 自動(dòng)化框架基礎(chǔ)指南pdf
        大數(shù)據(jù)測(cè)試過程、策略及挑戰(zhàn)

        測(cè)試框架原理,構(gòu)建成功的基石

        在自動(dòng)化測(cè)試工作之前,你應(yīng)該知道的10條建議

        在自動(dòng)化測(cè)試中,重要的不是工具


        事務(wù)(Transaction)

        數(shù)據(jù)庫的事務(wù)是數(shù)據(jù)庫并發(fā)控制的基本單位,一組操作的集合、序列。要么都執(zhí)行,要么都不執(zhí)行,是一個(gè)不可分割的整體。比如銀行的轉(zhuǎn)賬,錢從一個(gè)賬戶轉(zhuǎn)移到另一個(gè)賬戶,賬戶A扣錢賬戶B加錢,要么都執(zhí)行,要么都不執(zhí)行。不可能A扣了錢B沒有加錢,也不可能A沒扣錢B卻加了錢。


        數(shù)據(jù)庫的事務(wù)應(yīng)當(dāng)具有以下四種特性:

        Atomic(原子性)

        事務(wù)中包含的操作被看做一個(gè)邏輯單元,這個(gè)邏輯單元中的操作要么全部成功,要么全部失敗。


        Consistency(一致性)

        只有合法的數(shù)據(jù)可以被寫入數(shù)據(jù)庫,否則事務(wù)應(yīng)該將其回滾到最初狀態(tài)。


        Isolation(隔離性)

        事務(wù)允許多個(gè)用戶對(duì)同一個(gè)數(shù)據(jù)進(jìn)行并發(fā)訪問,而不破壞數(shù)據(jù)的正確性和完整性。

        同時(shí),并行事務(wù)的修改必須與其他并行事務(wù)的修改相互獨(dú)立。

        事務(wù)的隔離性一般由事務(wù)的來進(jìn)行控制。


        Durability(持久性)

        事務(wù)結(jié)束后,事務(wù)處理的結(jié)果必須能夠得到固化。


        數(shù)據(jù)庫的事務(wù)和程序的線程有相似的地方:

        1.線程之間共享同一片資源,而事務(wù)共享的則是數(shù)據(jù)庫內(nèi)的數(shù)據(jù)。

        2.多線程的意義在于并發(fā)執(zhí)行,提高效率;事務(wù)并發(fā)執(zhí)行也能提高程序與數(shù)據(jù)庫交互的效率。


        因此如何使用事務(wù)與事務(wù)相互之間的隔離級(jí)別,直接影響了數(shù)據(jù)庫的并發(fā)性和數(shù)據(jù)的準(zhǔn)確性。我們?cè)谠O(shè)計(jì)事務(wù)和選擇隔離級(jí)別時(shí)這些是應(yīng)該要考慮的。


        選擇完隔離級(jí)別與設(shè)計(jì)完事務(wù)之后,在使用過程中常常會(huì)遇到以下幾種情況:

        1.更新丟失(Lost update):兩個(gè)事務(wù)同時(shí)更新,但是第二個(gè)事務(wù)卻中途失敗退出,導(dǎo)致對(duì)數(shù)據(jù)的兩個(gè)修改都失效了。

        2.臟讀(Dirty Reads):一個(gè)事務(wù)開始讀取了某行數(shù)據(jù),但是另外一個(gè)事務(wù)已經(jīng)更新了此數(shù)據(jù)但沒有能夠及時(shí)提交。這是相當(dāng)危險(xiǎn)的,因?yàn)楹芸赡芩械牟僮鞫急换貪L。

        3.不可重復(fù)讀?。∟on-repeatable Reads):一個(gè)事務(wù)兩次讀取,但在第二次讀取前另一事務(wù)已經(jīng)更新了。

        4.虛讀(Phantom Reads):一個(gè)事務(wù)兩次讀取,第二次讀取到了另一事務(wù)插入的數(shù)據(jù)。

        5.兩次更新問題(Second lost updates problem):兩個(gè)事務(wù)都讀取了數(shù)據(jù),并同時(shí)更新,第一個(gè)事務(wù)更新失敗。


        隔離級(jí)別(低->高)

        ● 未授權(quán)讀?。≧ead Uncommitted)

        允許臟讀取,但不允許更新丟失。如果一個(gè)事務(wù)已經(jīng)開始寫數(shù)據(jù),則另外一個(gè)數(shù)據(jù)則不允許同時(shí)進(jìn)行寫操作,但允許其他事務(wù)讀此行數(shù)據(jù)。該隔離級(jí)別可以通過“排他寫鎖”實(shí)現(xiàn)。

        ● 授權(quán)讀?。≧ead Committed)

        允許不可重復(fù)讀取,但不允許臟讀取。這可以通過“瞬間共享讀鎖”和“排他寫鎖”實(shí)現(xiàn)。讀取數(shù)據(jù)的事務(wù)允許其他事務(wù)繼續(xù)訪問該行數(shù)據(jù),但是未提交的寫事務(wù)將會(huì)禁止其他事務(wù)訪問該行。

        ● 可重復(fù)讀?。≧epeatable Read)

        禁止不可重復(fù)讀取和臟讀取,但是有時(shí)可能出現(xiàn)幻影數(shù)據(jù)。這可以通過“共享讀鎖”和“排他寫鎖”實(shí)現(xiàn)。讀取數(shù)據(jù)的事務(wù)將會(huì)禁止寫事務(wù)(但允許讀事務(wù)),寫事務(wù)則禁止任何其他事務(wù)。

        ● 序列化(Serializable)

        提供嚴(yán)格的事務(wù)隔離。它要求事務(wù)序列化執(zhí)行,事務(wù)只能一個(gè)接著一個(gè)地執(zhí)行,但不能并發(fā)執(zhí)行。如果僅僅通過“行級(jí)鎖”是無法實(shí)現(xiàn)事務(wù)序列化的,必須通過其他機(jī)制保證新插入的數(shù)據(jù)不會(huì)被剛執(zhí)行查詢操作的事務(wù)訪問到。

        個(gè)人覺得隔離級(jí)別的翻譯不是很好理解,直接按照英語的意思理解更方便。

         

        eg:

        假設(shè)賬戶c1有1000元,c2有1000元,c3有1000元

        操作員u1執(zhí)行一次轉(zhuǎn)賬事務(wù)m1從c1轉(zhuǎn)移500元到c2,再從c1的余額中轉(zhuǎn)移50%元平均分配到 c1 c2 c3 c4 c5余額中

        操作員u2執(zhí)行一次轉(zhuǎn)賬事務(wù)m2從c2轉(zhuǎn)移1000元到c1

        操作員u3執(zhí)行一次轉(zhuǎn)賬事務(wù)m3從c1轉(zhuǎn)移200元到c2

        操作員u4開戶c4

        賬戶表為T_C,其包含字段為 賬戶名稱cname 余額money

        記錄為{c1,1000},{c2,1000}

        事務(wù)m1的操作包括,讀c1,讀c2,寫c1,寫c2,提交c1c2,讀c1,讀c3,寫c3,寫c3,提交c1c3

        事務(wù)m2的操作包括,讀c2,讀c1,寫c2,寫c1,提交c1c2

        事務(wù)m3的操作包括,讀c1,讀c2,寫c1,寫c2,提交c1c2

        事務(wù)m4的操作包括,寫c4,提交c4


        1.若未授權(quán)讀取ReadUncommitted

        m1讀c1,c2,寫了c1但沒寫c2此時(shí)m2不可以寫c2,可以讀取c1和c2,但是c2是臟讀。隔離級(jí)別使用了“排他寫”。


        2.若授權(quán)讀取ReadCommitted

        m1讀c1,c2,寫了c1但沒寫c2此時(shí)m2不可以寫c2,可以讀取c1,不能讀取c2,因?yàn)閏2是臟讀。隔離級(jí)別使用了“排他寫鎖”。

        m1讀寫了c1,c2,提交c1c2,m3提交了c1c2此時(shí)m1準(zhǔn)備第二次c1是允許的。隔離級(jí)別使用了“瞬間共享讀鎖”。(但由于第二次讀產(chǎn)生了不可重復(fù)讀的問題,事務(wù)1脫力了元自行,因?yàn)檫壿嬌峡词聞?wù)1中被插入了3,影響了c1的余額50%的計(jì)算。)


        3.若可重復(fù)讀取RepeatableRead

        m1讀c1,c2,寫了c1但沒寫c2此時(shí)m2不可以寫c2,可以讀取c1,不能讀取c2,因?yàn)閏2是臟讀。隔離級(jí)別使用了“排他寫鎖”。


        m1讀寫了c1,c2,提交c1c2,m4提交了c4此時(shí)m3是能讀不能寫c1并更新提交的。此時(shí)m4是能讀能能插入c4的。隔離級(jí)別使用了“共享讀鎖”。(和ReadCommitted比RepeatableRead區(qū)別對(duì)已經(jīng)提交的事務(wù)可以進(jìn)行讀,但不能寫,但是同一張表可以插入新的記錄。)


        4.序列化Serializable

        任何事務(wù)都只能等前一事務(wù)完全執(zhí)行完再執(zhí)行。但是失去了并發(fā)性。


        對(duì)于多數(shù)應(yīng)用程序,可以優(yōu)先考慮把數(shù)據(jù)庫系統(tǒng)的隔離級(jí)別設(shè)為Read Committed,它能夠避免臟讀取,而且具有較好的并發(fā)性能。盡管它會(huì)導(dǎo)致不可重復(fù)讀、虛讀和第二類丟失更新這些并發(fā)問題,在可能出現(xiàn)這類問題的個(gè)別場(chǎng)合,可以由應(yīng)用程序采用悲觀鎖或樂觀鎖來控制。


        選取數(shù)據(jù)庫的隔離級(jí)別時(shí),應(yīng)該注意以下幾個(gè)處理的原則:


        首先,必須排除“未授權(quán)讀取”,因?yàn)樵诙鄠€(gè)事務(wù)之間使用它將會(huì)是非常危險(xiǎn)的。事務(wù)的回滾操作或失敗將會(huì)影響到其他并發(fā)事務(wù)。第一個(gè)事務(wù)的回滾將會(huì)完全將其他事務(wù)的操作清除,甚至使數(shù)據(jù)庫處在一個(gè)不一致的狀態(tài)。很可能一個(gè)已回滾為結(jié)束的事務(wù)對(duì)數(shù)據(jù)的修改最后卻修改提交了,因?yàn)椤拔词跈?quán)讀取”允許其他事務(wù)讀取數(shù)據(jù),最后整個(gè)錯(cuò)誤狀態(tài)在其他事務(wù)之間傳播開來。


        其次,絕大部分應(yīng)用都無須使用“序列化”隔離(一般來說,讀取幻影數(shù)據(jù)并不是一個(gè)問題),此隔離級(jí)別也難以測(cè)量。目前使用序列化隔離的應(yīng)用中,一般都使用悲觀鎖,這樣強(qiáng)行使所有事務(wù)都序列化執(zhí)行。


        剩下的也就是在“授權(quán)讀取”和“可重復(fù)讀取”之間選擇了。我們先考慮可重復(fù)讀取。如果所有的數(shù)據(jù)訪問都是在統(tǒng)一的原子數(shù)據(jù)庫事務(wù)中,此隔離級(jí)別將消除一個(gè)事務(wù)在另外一個(gè)并發(fā)事務(wù)過程中覆蓋數(shù)據(jù)的可能性(第二個(gè)事務(wù)更新丟失問題)。這是一個(gè)非常重要的問題,但是使用可重復(fù)讀取并不是解決問題的唯一途徑。


        SQL語句可以使用SET TRANSACTION ISOLATION LEVEL來設(shè)置事務(wù)的隔離級(jí)別。

        如:SET TRANSACTION ISOLATION LEVEL Read Committed。


        若要在應(yīng)用程序中使用更嚴(yán)格或較寬松的隔離級(jí)別,可以通過使用 set transaction isolation level語句設(shè)置會(huì)話的隔離級(jí)別,來自定義整個(gè)會(huì)話的鎖定。指定隔離級(jí)別后,sql server會(huì)話中所有select語句的鎖定行為都運(yùn)行于該隔離級(jí)別上,并一直保持有效直到會(huì)話終止或者將隔離級(jí)別設(shè)置為另一個(gè)級(jí)別。


        鎖(并發(fā)控制的手段)

        獨(dú)占鎖(排他鎖)只允許一個(gè)事務(wù)訪問數(shù)據(jù)


        共享鎖允許其他事務(wù)繼續(xù)使用鎖定的資源


        更新鎖

        鎖就是保護(hù)指定的資源,不被其他事務(wù)操作,鎖定的資源包括行、頁、簇、表和數(shù)據(jù)庫。為了最小化鎖的成本,SQL Server自動(dòng)地以與任務(wù)相應(yīng)等級(jí)的鎖來鎖定資源對(duì)象。鎖定比較小的對(duì)象,例如鎖定行,雖然可以提高并發(fā)性,但是卻有較高的開支,因?yàn)槿绻i定許多行,那么需要占有更多的鎖。鎖定比較大的對(duì)象,例如鎖定表,會(huì)大大降低并發(fā)性,因?yàn)殒i定整個(gè)表就限制了其他事務(wù)訪問該表的其他部分,但是成本開支比較低,因?yàn)橹恍杈S護(hù)比較少的鎖。


        設(shè)置事務(wù)級(jí)別:SET TRANSACTION ISOLATION LEVEL

        開始事務(wù):begin tran

        提交事務(wù):COMMIT

        回滾事務(wù):ROLLBACK

        創(chuàng)建事務(wù)保存點(diǎn):SAVE TRANSACTION savepoint_name

        回滾到事務(wù)點(diǎn):ROLLBACK TRANSACTION savepoint_name


        微信搜一搜 或 長按加群
        開源優(yōu)測(cè)


        瀏覽 75
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            免费全黄A片免费播放 | 99精品一区二区 | 四虎精品视频在线 | 国产一级国产一级毛片 | 啊用力嗯轻一点啊 | 男人舔女人下部高潮全视频 | 中文字幕综合在线 | 日韩中文字幕无码 | 懂色AV一区二区三区国产中文在线 | 男女视频久久一区二区 |