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

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

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

      事務(wù)隔離級別及特性

      如果一個數(shù)據(jù)庫聲稱支持事務(wù)的操作,那么該數(shù)據(jù)庫必須要具備以下四個特性:

      ⑴ 原子性(Atomicity)

        原子性是指事務(wù)包含的所有操作要么全部成功,要么全部失敗回滾,這和前面兩篇博客介紹事務(wù)的功能是一樣的概念,因此事務(wù)的操作如果成功就必須要完全應(yīng)用到數(shù)據(jù)庫,如果操作失敗則不能對數(shù)據(jù)庫有任何影響。

      ⑵ 一致性(Consistency)

        一致性是指事務(wù)必須使數(shù)據(jù)庫從一個一致性狀態(tài)變換到另一個一致性狀態(tài),也就是說一個事務(wù)執(zhí)行之前和執(zhí)行之后都必須處于一致性狀態(tài)。

        拿轉(zhuǎn)賬來說,假設(shè)用戶A和用戶B兩者的錢加起來一共是5000,那么不管A和B之間如何轉(zhuǎn)賬,轉(zhuǎn)幾次賬,事務(wù)結(jié)束后兩個用戶的錢相加起來應(yīng)該還得是5000,這就是事務(wù)的一致性。

      ⑶ 隔離性(Isolation)

        隔離性是當(dāng)多個用戶并發(fā)訪問數(shù)據(jù)庫時,比如操作同一張表時,數(shù)據(jù)庫為每一個用戶開啟的事務(wù),不能被其他事務(wù)的操作所干擾,多個并發(fā)事務(wù)之間要相互隔離。

        即要達(dá)到這么一種效果:對于任意兩個并發(fā)的事務(wù)T1和T2,在事務(wù)T1看來,T2要么在T1開始之前就已經(jīng)結(jié)束,要么在T1結(jié)束之后才開始,這樣每個事務(wù)都感覺不到有其他事務(wù)在并發(fā)地執(zhí)行。

        關(guān)于事務(wù)的隔離性數(shù)據(jù)庫提供了多種隔離級別,稍后會介紹到。

      ⑷ 持久性(Durability)

        持久性是指一個事務(wù)一旦被提交了,那么對數(shù)據(jù)庫中的數(shù)據(jù)的改變就是永久性的,即便是在數(shù)據(jù)庫系統(tǒng)遇到故障的情況下也不會丟失提交事務(wù)的操作。

        例如我們在使用JDBC操作數(shù)據(jù)庫時,在提交事務(wù)方法后,提示用戶事務(wù)操作完成,當(dāng)我們程序執(zhí)行完成直到看到提示后,就可以認(rèn)定事務(wù)以及正確提交,即使這時候數(shù)據(jù)庫出現(xiàn)了問題,也必須要將我們的事務(wù)完全執(zhí)行完成,否則就會造成我們看到提示事務(wù)處理完畢,但是數(shù)據(jù)庫因為故障而沒有執(zhí)行事務(wù)的重大錯誤。

        

        以上介紹完事務(wù)的四大特性(簡稱ACID),現(xiàn)在重點來說明下事務(wù)的隔離性,當(dāng)多個線程都開啟事務(wù)操作數(shù)據(jù)庫中的數(shù)據(jù)時,數(shù)據(jù)庫系統(tǒng)要能進(jìn)行隔離操作,以保證各個線程獲取數(shù)據(jù)的準(zhǔn)確性,在介紹數(shù)據(jù)庫提供的各種隔離級別之前,我們先看看如果不考慮事務(wù)的隔離性,會發(fā)生的幾種問題:

      1,臟讀

        臟讀是指在一個事務(wù)處理過程里讀取了另一個未提交的事務(wù)中的數(shù)據(jù)。

        當(dāng)一個事務(wù)正在多次修改某個數(shù)據(jù),而在這個事務(wù)中這多次的修改都還未提交,這時一個并發(fā)的事務(wù)來訪問該數(shù)據(jù),就會造成兩個事務(wù)得到的數(shù)據(jù)不一致。例如:用戶A向用戶B轉(zhuǎn)賬100元,對應(yīng)SQL命令如下

      1 update account set money=money+100 where name=’B’;  (此時A通知B)
      2 update account set money=money - 100 where name=’A’;

      當(dāng)只執(zhí)行第一條SQL時,A通知B查看賬戶,B發(fā)現(xiàn)確實錢已到賬(此時即發(fā)生了臟讀),而之后無論第二條SQL是否執(zhí)行,只要該事務(wù)不提交,則所有操作都將回滾,那么當(dāng)B以后再次查看賬戶時就會發(fā)現(xiàn)錢其實并沒有轉(zhuǎn)。

      2,不可重復(fù)讀

        不可重復(fù)讀是指在對于數(shù)據(jù)庫中的某個數(shù)據(jù),一個事務(wù)范圍內(nèi)多次查詢卻返回了不同的數(shù)據(jù)值,這是由于在查詢間隔,被另一個事務(wù)修改并提交了。

        例如事務(wù)T1在讀取某一數(shù)據(jù),而事務(wù)T2立馬修改了這個數(shù)據(jù)并且提交事務(wù)給數(shù)據(jù)庫,事務(wù)T1再次讀取該數(shù)據(jù)就得到了不同的結(jié)果,發(fā)送了不可重復(fù)讀。

        不可重復(fù)讀和臟讀的區(qū)別是,臟讀是某一事務(wù)讀取了另一個事務(wù)未提交的臟數(shù)據(jù),而不可重復(fù)讀則是讀取了前一事務(wù)提交的數(shù)據(jù)。

        在某些情況下,不可重復(fù)讀并不是問題,比如我們多次查詢某個數(shù)據(jù)當(dāng)然以最后查詢得到的結(jié)果為主。但在另一些情況下就有可能發(fā)生問題,例如對于同一個數(shù)據(jù)A和B依次查詢就可能不同,A和B就可能打起來了……

      3,虛讀(幻讀)

        幻讀是事務(wù)非獨立執(zhí)行時發(fā)生的一種現(xiàn)象。例如事務(wù)T1對一個表中所有的行的某個數(shù)據(jù)項做了從“1”修改為“2”的操作,這時事務(wù)T2又對這個表中插入了一行數(shù)據(jù)項,而這個數(shù)據(jù)項的數(shù)值還是為“1”并且提交給數(shù)據(jù)庫。而操作事務(wù)T1的用戶如果再查看剛剛修改的數(shù)據(jù),會發(fā)現(xiàn)還有一行沒有修改,其實這行是從事務(wù)T2中添加的,就好像產(chǎn)生幻覺一樣,這就是發(fā)生了幻讀。

        幻讀和不可重復(fù)讀都是讀取了另一條已經(jīng)提交的事務(wù)(這點就臟讀不同),所不同的是不可重復(fù)讀查詢的都是同一個數(shù)據(jù)項,而幻讀針對的是一批數(shù)據(jù)整體(比如數(shù)據(jù)的個數(shù))。

       

      現(xiàn)在來看看MySQL數(shù)據(jù)庫為我們提供的四種隔離級別:

        ① Serializable (串行化):可避免臟讀、不可重復(fù)讀、幻讀的發(fā)生。

        ② Repeatable read (可重復(fù)讀):可避免臟讀、不可重復(fù)讀的發(fā)生。

        ③ Read committed (讀已提交):可避免臟讀的發(fā)生。

        ④ Read uncommitted (讀未提交):最低級別,任何情況都無法保證。

       

        以上四種隔離級別最高的是Serializable級別,最低的是Read uncommitted級別,當(dāng)然級別越高,執(zhí)行效率就越低。像Serializable這樣的級別,就是以鎖表的方式(類似于Java多線程中的鎖)使得其他的線程只能在鎖外等待,所以平時選用何種隔離級別應(yīng)該根據(jù)實際情況。在MySQL數(shù)據(jù)庫中默認(rèn)的隔離級別為Repeatable read (可重復(fù)讀)。

        在MySQL數(shù)據(jù)庫中,支持上面四種隔離級別,默認(rèn)的為Repeatable read (可重復(fù)讀);而在Oracle數(shù)據(jù)庫中,只支持Serializable (串行化)級別和Read committed (讀已提交)這兩種級別,其中默認(rèn)的為Read committed級別。

        在數(shù)據(jù)庫中有兩種方法解決幻讀:

        1. 悲觀鎖

        假設(shè)幻讀一定會發(fā)生,讀取一行數(shù)據(jù)前,先鎖定該行,然后確保只有加鎖的線程/進(jìn)程能夠修改該行數(shù)據(jù)。

        2. 樂觀鎖

        假設(shè)幻讀不會發(fā)生,如果在讀寫過程中發(fā)生了變化(通常另外加一個字段,通過比對該字段有沒變化),更新操作則失敗,由程序決定失敗后如何操作。

      posted @ 2017-11-02 18:11  lpfuture  閱讀(413)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产一区二三区日韩精品| 国产日韩久久免费影院| 熟妇的奶头又大又长奶水视频| 最新国产AV最新国产在钱| 国产一区国产精品自拍| 一个人在看www免费| 久久综合狠狠综合久久激情| 亚洲18禁一区二区三区| 少妇伦子伦情品无吗| 精品人妻系列无码人妻免费视频| 午夜夜福利一区二区三区| 亚洲成色精品一二三区| 桃花岛亚洲成在人线AV| 综合图区亚洲另类偷窥| 99视频精品全部免费 在线| 一区二区三区四区亚洲自拍| 亚洲国产日韩欧美一区二区三区| 激情综合网激情五月激情| 免费午夜无码片在线观看影院| 国产精品福利自产拍久久| 国产精品疯狂输出jk草莓视频| 国产乱妇乱子在线视频| 国产91精品一区二区蜜臀| 性做久久久久久久| 亚洲精品乱码久久观看网| 午夜精品福利亚洲国产| 一本色道久久东京热| 国产在线无码不卡播放| yy111111在线尤物| 元码人妻精品一区二区三区9| 亚洲人成在线观看| 91亚洲国产成人久久精品| 亚洲夂夂婷婷色拍ww47| 亚洲精品男男一区二区| 国产精一区二区黑人巨大| 青草99在线免费观看| 国产精品一区中文字幕| 中国少妇人妻xxxxx| 亚洲熟女乱综合一区二区| 国产AV福利第一精品| 萍乡市|