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

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

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

    少年阿賓

    那些青春的歲月

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks

    ANSI/ISO  SQL的四個isolation level

    SERIALIZABLE

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

    在基于鎖的DBMS中,Serializable直到事務結束才釋放select數據集上的讀、寫鎖。而且select查詢語句必須首先獲得range-locks才能執行。在非鎖并行的DBMS中,系統每當檢測到write collision時,一次只有一個write能被寫入。

    range lock

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

    REPEATABLE READS

    在基于鎖的DBMS中,Repeatable Reads直到事務結束才釋放select數據集上的讀、寫鎖。但不會使用range lock,因此會產生Phantom Read。

    READ COMMITTED

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

    READ UNCOMMITTED

    這是Isolation Level的最底層,不僅會產生Phantom Read、Unrepeatable Read,還會有Dirty Read的風險。

    Read phenomena

    SQL 92標準將事務T1讀寫T2的操作分為三種,Phantom Read、Unrepeatable Read和Dirty Read         Users
    idnameage
    1Joe20
    2Jill25

    Dirty reads (Uncommitted Dependency)

    事務T1在讀取事務T2已經修改、但T2還未提交的數據時會發生Dirty Read。這個Isolation Level唯一能保證的是Update操作按順序執行,即事務中前面的update一定比后面的update先執行。

    下面的這個例子是一個典型的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

    在一個事務T1中,如果對同一條記錄讀取兩次而值不一樣,那么就發生了Non-repeatable read。

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

    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 */

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

    Phantom reads

    Phantom read是指在一個事務中,執行兩個或多個同樣的查詢返回的結果集卻不相同的現象。這種現象發生在沒獲得range lock即進行select... where....操作時,解決方法是使用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) 評論(0)  編輯  收藏 所屬分類: Database
    主站蜘蛛池模板: 国产1024精品视频专区免费| 91福利免费体验区观看区| 处破痛哭A√18成年片免费| 亚洲成年人免费网站| 免费人成在线观看69式小视频| 亚洲av无码一区二区三区网站| 国产一级片免费看| 久久亚洲精精品中文字幕| 全部免费毛片在线播放| 精品无码一区二区三区亚洲桃色| 5555在线播放免费播放| 亚洲国产精品一区二区久| 国内精品乱码卡1卡2卡3免费 | 亚洲综合免费视频| 亚洲天堂一区二区三区四区| 野花高清在线电影观看免费视频 | 噜噜综合亚洲AV中文无码| 免费在线观看亚洲| jzzjzz免费观看大片免费| 亚洲爆乳精品无码一区二区三区| 免费国产污网站在线观看| 久久久久亚洲av无码专区| 1000部无遮挡拍拍拍免费视频观看| 亚洲国产精品成人综合色在线婷婷| 成年女人色毛片免费看| 国产亚洲高清在线精品不卡| 激情综合色五月丁香六月亚洲| 国产精品免费观看调教网| 亚洲黄页网在线观看| 亚洲成AV人网址| 日韩精品人妻系列无码专区免费| 国产 亚洲 中文在线 字幕| 亚洲国产综合无码一区二区二三区| 伊人免费在线观看| 亚洲中文无码永久免费| 久久精品国产亚洲AV不卡| 曰批视频免费40分钟试看天天 | 日韩在线一区二区三区免费视频 | 人妻免费久久久久久久了| 久久久综合亚洲色一区二区三区 | 中文字幕无码不卡免费视频|