<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    少年阿賓

    那些青春的歲月

      BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
      500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks

    ANSI/ISO  SQL的四個(gè)isolation level

    SERIALIZABLE

    這是最高層次isolation level,這個(gè)層次的isolation實(shí)現(xiàn)了串行化的效果,即:幾個(gè)Transcation在執(zhí)行時(shí),其執(zhí)行效果和某個(gè)串行序執(zhí)行這幾個(gè)Transaction的效果是一樣的。使用Serializable層次的事務(wù),其中的查詢語(yǔ)句在每次都必須在同樣的數(shù)據(jù)上執(zhí)行,從而防止了phantom read,其實(shí)現(xiàn)機(jī)制是range lock。與下一個(gè)層次的不同之處在于range lock。

    在基于鎖的DBMS中,Serializable直到事務(wù)結(jié)束才釋放select數(shù)據(jù)集上的讀、寫(xiě)鎖。而且select查詢語(yǔ)句必須首先獲得range-locks才能執(zhí)行。在非鎖并行的DBMS中,系統(tǒng)每當(dāng)檢測(cè)到write collision時(shí),一次只有一個(gè)write能被寫(xiě)入。

    range lock

    Range lock記錄Serializable Transaction所讀取的key值范圍,阻止其他在這個(gè)key值范圍內(nèi)的記錄被插入到表中。Range lock位于Index上,記錄一個(gè)起始Index和一個(gè)終止Index。在Range lock鎖定的Index范圍內(nèi),任何Update、Insert和Delete操作都是被禁止的,從而保證了Serializable中的操作每次都在同樣的數(shù)據(jù)集上進(jìn)行。

    REPEATABLE READS

    在基于鎖的DBMS中,Repeatable Reads直到事務(wù)結(jié)束才釋放select數(shù)據(jù)集上的讀、寫(xiě)鎖。但不會(huì)使用range lock,因此會(huì)產(chǎn)生Phantom Read。

    READ COMMITTED

    在基于鎖的DBMS中,Read Committed直到事務(wù)結(jié)束才釋放select數(shù)據(jù)集上的寫(xiě)鎖,但讀鎖會(huì)在一個(gè)select完成后才被釋放。和Repeatable Read一樣,Read Committed不使用range lock,會(huì)產(chǎn)生Phantom read和Unrepeatable read。(注:這段主要參考wikipedia,我也搜索過(guò)Read Committed,基本都采用了這種說(shuō)法。但我有一個(gè)疑問(wèn),既然write鎖直到事務(wù)提交才釋放,那么在這個(gè)階段是不會(huì)發(fā)生update操作的,在一個(gè)事務(wù)中的多個(gè)讀應(yīng)該也不會(huì)產(chǎn)生不同的結(jié)果才對(duì)。望知之者指點(diǎn)一二,小弟不勝感激。)

    READ UNCOMMITTED

    這是Isolation Level的最底層,不僅會(huì)產(chǎn)生Phantom Read、Unrepeatable Read,還會(huì)有Dirty Read的風(fēng)險(xiǎn)。

    Read phenomena

    SQL 92標(biāo)準(zhǔn)將事務(wù)T1讀寫(xiě)T2的操作分為三種,Phantom Read、Unrepeatable Read和Dirty Read         Users
    idnameage
    1Joe20
    2Jill25

    Dirty reads (Uncommitted Dependency)

    事務(wù)T1在讀取事務(wù)T2已經(jīng)修改、但T2還未提交的數(shù)據(jù)時(shí)會(huì)發(fā)生Dirty Read。這個(gè)Isolation Level唯一能保證的是Update操作按順序執(zhí)行,即事務(wù)中前面的update一定比后面的update先執(zhí)行。

    下面的這個(gè)例子是一個(gè)典型的Dirty Read

    Transaction 1Transaction 2
    /* Query 1 */
    SELECT age FROM users WHERE id = 1;
    /* will read 20 */
    
     
     
    /* Query 2 */
    UPDATE users SET age = 21 WHERE id = 1;
    /* No commit here */
    
    /* Query 1 */
    SELECT age FROM users WHERE id = 1;
    /* will read 21 */
    
     
     
    ROLLBACK; /* lock-based DIRTY READ */
    

    Non-repeatable reads

    在一個(gè)事務(wù)T1中,如果對(duì)同一條記錄讀取兩次而值不一樣,那么就發(fā)生了Non-repeatable read。

    在基于鎖的DBMS中,Non-repeatable read可能在未獲得read lock時(shí)進(jìn)行select操作,或在select操作剛結(jié)束就釋放read lock時(shí)發(fā)生。在多版本并行控制的DBMS中,non-repeatable read可能在違背“受commit conflict影響的事務(wù)必須回滾“的原則時(shí)發(fā)生。

    Transaction 1Transaction 2
    /* Query 1 */ SELECT * FROM users WHERE id = 1; 
     
     
    /* Query 2 */ UPDATE users SET age = 21 WHERE id = 1; COMMIT; /* in multiversion concurrency    control, or lock-based READ COMMITTED */ 
    /* Query 1 */ SELECT * FROM users WHERE id = 1; COMMIT; /* lock-based REPEATABLE READ */

    有兩種方式來(lái)防止non-repeatable read。第一種方式用鎖使T1和T2串行。另外一種方式是在多版本并行控制的DBMS中使用的。在這里,T2可以提交,而先于T2啟動(dòng)的T1則在自己的Snapshot(快照)里繼續(xù)執(zhí)行,在T1提交時(shí),系統(tǒng)會(huì)檢查其結(jié)果是否與T1、T2序執(zhí)行的結(jié)果一樣,如果一樣,則T1提交,否則T1必須回滾并生成一個(gè)serialization failure。

    Phantom reads

    Phantom read是指在一個(gè)事務(wù)中,執(zhí)行兩個(gè)或多個(gè)同樣的查詢返回的結(jié)果集卻不相同的現(xiàn)象。這種現(xiàn)象發(fā)生在沒(méi)獲得range lock即進(jìn)行select... where....操作時(shí),解決方法是使用range lock。

    Transaction 1Transaction 2
    /* Query 1 */ SELECT * FROM users WHERE age BETWEEN 10 AND 30; 
     
     
    /* Query 2 */ INSERT INTO users VALUES ( 3, 'Bob', 27 ); COMMIT; 
    /* Query 1 */ SELECT * FROM users WHERE age BETWEEN 10 AND 30; 
     

    參考:

    http://msdn.microsoft.com/en-us/library/ms191272.aspx
    http://en.wikipedia.org/wiki/Isolation_%28database_systems%29

    posted on 2015-01-31 18:15 abin 閱讀(407) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Database
    主站蜘蛛池模板: 免费A级毛片无码久久版| 亚洲色欲久久久久综合网| 不卡精品国产_亚洲人成在线| 亚洲精品视频在线| 亚洲高清国产拍精品熟女| 91国内免费在线视频| 永久免费的网站在线观看| 超清首页国产亚洲丝袜| 亚洲字幕AV一区二区三区四区| 成人免费一区二区三区| 成年女人喷潮毛片免费播放| 亚洲最大激情中文字幕| 中文无码亚洲精品字幕| 亚洲免费人成在线视频观看 | 暖暖免费高清日本中文| 国产精品久久久亚洲| 亚洲AV无码片一区二区三区| 亚洲免费在线播放| 亚洲成AⅤ人影院在线观看| 亚洲精品国产啊女成拍色拍| 国产乱子伦精品免费视频| 成年女人18级毛片毛片免费观看| 亚洲AV无码成人精品区在线观看 | 亚洲图片在线观看| 免费激情网站国产高清第一页| 69堂人成无码免费视频果冻传媒| 国产自偷亚洲精品页65页| 亚洲丰满熟女一区二区哦| 18禁美女裸体免费网站| 在线观看午夜亚洲一区| 国产亚洲漂亮白嫩美女在线 | 亚洲欧美第一成人网站7777| 三年片在线观看免费观看大全一 | 四虎影视永久免费观看地址| 亚洲国产成人手机在线电影bd| 国内精品99亚洲免费高清| 国产一级高清视频免费看| 亚洲人成人77777在线播放| 国产精品99久久免费观看| 亚洲综合另类小说色区色噜噜| 亚洲精品国产高清在线观看|