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

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

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

    posts - 297,  comments - 1618,  trackbacks - 0

    1、事務

          事務是指作為單個邏輯工作單元執行的一系列操作。 事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向數據的資源。通過將一組相關操作組合為一個要么全部成功要么全部失敗的單元,可以簡化錯誤恢復并使應用程序更加可靠。數據庫服務器保證在事務范圍內執行的操作完整且正確地提交至磁盤,否則數據庫會復原至事務啟動之前的狀態。
         一個邏輯工作單元要成為事務,必須滿足所謂的ACID屬性。ACID的具體含義如下:
         1)A(Atomicity):操作序列要么完整的執行,否則什么都不做;
         2)C(Consistency):一致性,事務執行后,保證數據庫從一個一致性狀態到另外一個一致性狀態;
         3)I(Isolation):隔離,一個事務的中間狀態對其他事務不可見,即每個用戶都感覺他們在單獨使用數據庫。隔離級別用來定義多大程度的隔離多個不同的事務;
         4)D(Durability):持久性,事務的有效性,不會應用硬件或軟件的失敗而丟失。
    2、并發控制
          1)相關概念
           i)隔離(+一致性) => 并發控制;
           ii)多個事務可以訪問或修改相同的資源;
           iii)只要多個進程共享資源,就需要對訪問進程進行排隊控制;
           iv)在進行并發控制時,數據庫內部將生成多個并發事務訪問資源的操作序列表,并且每一個事務內部的各個操作都需要序列化。
           2)串行調度存在的問題
           在串行調度中,采用操作序列,一個事務完成了再完成另外一個,即使兩個事務T1、T2更新的是數據庫中不同的對象。此種方式從并發和性能角度考慮,都不能很好的利用計算機資源。
           為了改善性能,需要采用非串行調度,即允許事務并發執行,即一個事務內的操作可以在其他事務提交前開始執行。
            3)并發調度的常見問題
            i)臟讀:事務T2讀取到了事務T1沒有提交的結果
             例如如下的操作序列會導致臟讀:
             事務T1讀取記錄,然后更新記錄;
             事務T2讀取了更新后的記錄;
             若T1后續操作失敗,會導致更新的記錄回滾,而同時事務T2已經使用了這個沒有提交的值。
             ii)不可重復讀:事務T1中多個讀操作返回不同的結果
             事務T1讀取一個對象;
             事務T2讀取并更新同一個對象;
             事務T1再次讀取同一個對象返回了不同的值。
             iii)幻影讀:如果事務T1在同樣的情況下多次執行select讀取的結果不同
             事務T1從一個表中檢索滿足特定條件的記錄返回m條記錄;
             事務T2往該表中insert/delete其他滿足相同條件的記錄;
             事務T1再次以相同的條件檢索該表的數據返回的數據記錄不為m條。
    3、鎖機制
           1)相關概念
            i)用戶可以鎖定一個對象,可以防止 其它用戶修改鎖定的對象;
            ii)在多個用戶并發訪問數據庫的情況下,為保證數據完整性,鎖是很有必要的;
            iii)程序可以顯式的對數據枷鎖,數據庫系統可以隱式的對對象進行加鎖。
           2)鎖的類型
           i)共享鎖(Shared locks):多個用戶可以讀取相同的記錄
           如果一個對象上沒有排他鎖,則共享鎖可以加在該對象上,它可以防止其他事務更新數據,但同時,其他事務可以讀取該數據,多個事務可以在同一個對象上加多個共享鎖。
           ii)排他鎖(Exclusive locks):同一時間僅僅有一個用戶可以讀取相同的記錄
           如果一個對象上沒有任何鎖,排他鎖才可以加在該對象上。一旦在記錄上加了排他鎖,則不能在該記錄上增加任何鎖了,直至鎖釋放。它可以防止其他事務讀取和更新數據。
           iii)提升/更新鎖(Promotable/Update lock):可以對鎖進行升級或者降級
           在更新游標時使用,由游標在含有“for update”選項執行時產生,只能在沒有排他鎖或其他更新鎖的記錄上加更新鎖。當鎖定的記錄真正執行的時候,更新鎖將提升為排他鎖。
           iv)專一鎖(Intent lock):是一種表級鎖,標識在該表上有一個游標在讀取數據
           由IDS自動分配,如果一條記錄上的記錄被更新,一個排他鎖將分配在該記錄上,同時將該記錄的表上自動加上專一鎖,這能保證沒有session可以在該表上增加排他鎖,只要該表中有記錄被增加了排他鎖。
           3)鎖的有效期
            i)程序可以控制數據庫鎖的有效期;
            ii)當數據庫關閉后,數據庫鎖將被釋放;
            iii)根據數據庫使用了事務的情況,表鎖的有效期不同。如果數據沒有使用事務(沒有使用事務日志,也不使用commit work語句),顯式對一個表lock,當執行unload table時,鎖將被釋放;
            iv)當數據庫使用了事務,事務結束時,將釋放事務所有的鎖。
            4)不同粒度的鎖
             i)數據庫級別的鎖:數據庫管理活動,比如imports和exports。例如:
    DATABASE database_name EXCLUSIVE;
             ii)表級別的鎖:當整個表或表的大部分數據需要更新,加表級鎖效率高。參考語句如下:
             創建排他鎖實例:
    LOCK TABLE tab1 IN EXCLUSIVE MODE;
             創建共享鎖實例:
    LOCK TABLE tab2 IN SHARE MODE;
             取消表上的鎖實例:
    UNLOCK TABLE tab1;
             iii)頁級鎖:當按數據物理順序進行訪問和更新時,頁級鎖效率高。修改鎖模似為頁級鎖的參考語句如下:
    ALTER TABLE tab1 LOCK MODE PAGE;
            頁級鎖模式是數據庫默認的表鎖模式。
             iv)行級鎖:OLTP事務采用行級鎖效率高。創建表時指定為行級鎖的參考語句如下:
    CREATE TABLE tab1 (col1) LOCK MODE ROW;
             將某表修改為行級別的語句參考如下:
    ALTER TABLE tab1 LOCK MODE (ROW);
             5)何種情況下用何種鎖?
             i)如果更新表中相對較小一部分數據的時候,采用行級鎖將獲取最好的性能,如果一個事務只訪問表中的一小部分數據,那就采用行級鎖。
             ii)如果一個事務頻繁訪問整個表中的數據,設置更粗的力度,比如表級鎖;
             iii)如果更新數據庫中大部分表的大部分數據的情況下,采用數據庫級別的鎖;
             iv)informix默認的鎖模式為頁級鎖。
             v)ONCONFIG參數DEF_TABLE_LOCKMODE用于設置默認鎖模式;
             vi)查看表鎖模式的方法如下:
             方法1:
    oncheck –pt dbname:tablename;
             方法2:
    dbschema –d dbname –t tablename -ss;
    4、事務和會話的隔離級別
            1)Dirty Read(臟讀)
            設置為Dirty Read隔離級別的參考語句如下:
    SET ISOLATION TO DIRTY READ;
             采用這種隔離級別,數據庫服務器不會分配任何鎖。查詢過程中,可以查詢到任何數據行,甚至那些被修改但尚未提交的記錄。非日志數據庫中只有Dirty-Read一種隔離級別。它一般用在如下應用場景:
             靜態表(沒有更新,只讀的表),速度比100%準備更重要的情況,以及不能等待鎖的釋放的情況中。
             2)Commited Read(只讀已提交的數據)
             設置為該級別的參考語句如下:
    SET ISOLATION TO COMMITTED READ;
             這種隔離級別能確保所有的記錄都是提交到數據庫的,因而能避免讀取到臟數據,能確保所有讀取到的記錄都是已提交的,當一個進程讀完記錄后,其它進程就可以修改。
             在讀取數據前,數據庫服務器嘗試在記錄上加共享鎖。加鎖前,需要先檢查是否可以對對象加共享鎖;如果可以加鎖,則要保證要加鎖的記錄沒有其他進程正在更新;當繼續正在更新時,記錄上有排他鎖,此時我們不能對記錄加共享鎖。
              3)Cursor Stability(游標穩定性)
              參考設置語句如下:
    SET ISOLATION TO CURSOR STABILITY;
             給更新Cursor,游標讀的所有記錄加上共享鎖。通過游標檢索數據,共享鎖將一直保持到執行下一個FETCH語句。不僅可以看到提交的記錄,也可以保證看到的記錄不會被更新,其它進程不能更新或刪除你鎖看到的記錄,當移動到下一行時,鎖才會釋放,記錄就可以進行修改。
             4)Repeatable Read(可重復讀) 
             參考設置語句如下:
    SET ISOLATION TO REPEATABLE READ;

          數據庫在讀取的記錄上加共享鎖,驗證是否可以讀取數據,直到事務提交,鎖才能釋放,其他用戶可以讀取數據,但是不能修改。可以保證在同一事務中前后兩次讀取記錄是一致的。當必須要信任所有讀取的記錄,保證記錄不被修改,我們可以采用repeatable read,例如統計數據(銀行賬號的余額情況)、關聯查詢多個表等。
             5)Last Committed Read(讀取最后提交的數據)
             這是一種樂觀鎖,它解決了Commited Read的不足,因為Commited Read在記錄被鎖時,其它進程需要等待。
             這種隔離級別常被用在WEB應用系統中,例如在電子商務系統中,可以選擇商品添加到購物籃中,但是此時后臺可能你正在對商品的價格進行更新,當再次檢查的時候,可能發現商品的價格已經發生變化。
             設置語句參考如下:

        SET ISOLATION TO COMMITTED READ LAST COMMITTED;

              相對Committed Read而言,提高了并發量和系統的吞吐量。可以通過ONCONFIG參數設置為隔離級別:USELASTCOMMITTED。表需要設置為行級鎖,不能是頁級鎖。
              6)幾種隔離級別的比較
              隔離級別                          臟讀?              不可重復讀?              幻影讀?
              Dirty Read                          Yes                         Yes                             Yes
              Last Commited Read         No                          Yes                             Yes          
              Commited Read                  No                          Yes                             Yes
              Cursor Stability                  No                          No                              Yes
              Repeatable Read                No                          No                               No            
    5、設置事務/會話的鎖模式
             1)不等待鎖的釋放
             為默認的鎖模式,如果數據庫對象被鎖,則立即返回錯誤。錯誤消息參考如下:

    -244: Could not do a physical-order read to fetch the next row
    • 
    107: ISAM error: record is locked
             設置為此種鎖模式的參考語句如下:
    SET LOCK MODE TO NOT WAIT;
              2)一直等待鎖的釋放
              一個事務可能發生死鎖或掛住,等待資源的釋放。設置為此種模式的語句如下:
    SET LOCK MODE TO WAIT;
              3)在鎖釋放前,等待n秒
              直到等待n秒后,如果鎖一直沒有釋放將返回鎖等待超時錯誤信息。參考設置語句如下:
    SET LOCK MODE TO WAIT 20;
    6、鎖的監控
             1)監控session的隔離級別
             使用: onstat –g sql 或者 onstat –g ses,例如在筆者測試服務器上運行onstat -g sql,運行結果如下:
    IBM Informix Dynamic Server Version 10.00.UC1     -- On-Line (Prim) -- Up 102 days 05:26:42 -- 1507468 Kbytes

    Sess  SQL            
    Current            Iso Lock       SQL  ISAM F.E.
    Id    Stmt type      
    Database           Lvl Mode       ERR  ERR  Vers Explain    
    880   -              sdp                CR  Wait 20    0    0    9.03 Off        
    878   SELECT         sdp                CR  Not Wait   0    0    9.03 Off        
    877   -              sdp                CR  Wait 20    0    0    9.03 Off        
    756   -              sdp                CR  Wait 20    0    0    9.03 Off        
    755   -              sdp                CR  Wait 20    0    0    9.03 Off        
    754   -              sdp                CR  Wait 20    0    0    9.03 Off        
    753   -              sdp                CR  Wait 20    0    0    9.03 Off        
    752                  sdp                CR  Wait 20    0    0    9.03 Off        
    751   -              sdp                CR  Wait 20    0    0    9.03 Off        
    750   -              sdp                CR  Wait 20    0    0    9.03 Off        
    480   -              sdp                CR  Wait 20    0    0    9.03 Off        
    479   -              sdp                CR  Wait 20    0    0    9.03 Off        
    478   -              sdp                CR  Wait 20    0    0    9.03 Off        
    477   -              sdp                CR  Wait 20    0    0    9.03 Off        
    476   -              sdp                CR  Wait 20    0    0    9.03 Off        
    475   -              sdp                CR  Wait 20    0    0    9.03 Off        
    474   -              sdp                CR  Wait 20    0    0    9.03 Off        
    473   -              sdp                CR  Wait 20    0    0    9.03 Off        
    472   -              sdp                CR  Wait 20    0    0    9.03 Off        
    471   -              sdp                CR  Wait 20    0    0    9.03 Off        
    470   -              sdp                CR  Wait 20    0    0    9.03 Off        
    469   -              sdp                CR  Wait 20    0    0    9.03 Off        
    468   -              sdp                CR  Wait 20    0    0    9.03 Off        
    467   -              sdp                CR  Wait 20    0    0    9.03 Off        
    466   -              sdp                CR  Wait 20    0    0    9.03 Off        
    465   -              sdp                CR  Wait 20    -232 0    9.03 Off        
    464   -              sdp                CR  Wait 20    0    0    9.03 Off        
    463   -              sdp                CR  Wait 20    0    0    9.03 Off        
    43    -              sdp                CR  Wait 20    0    0    9.03 Off        
    40    -              sdp                CR  Wait 20    0    0    9.03 Off    
            查看sid的詳細信息: onstat –g sql sid,例如查看878這個sid的消息,可使用:onstat -g sql 878,參考返回結果如下:
    Sess  SQL            Current            Iso Lock       SQL  ISAM F.E.
    Id    Stmt type      
    Database           Lvl Mode       ERR  ERR  Vers Explain    
    878   -              sdp                CR  Wait 20    0    0    9.03 Off        

    Last parsed SQL statement :
      
    select count(*from 

           2)查看用戶進程鎖等待情況
           使用: onstat –u。
           3)查看鎖使用和等待情況
           使用: onstat -k
           4)監控數據庫事務及其狀態
           使用: onstat -x

     
    posted on 2010-11-23 10:22 阿蜜果 閱讀(11383) 評論(0)  編輯  收藏 所屬分類: database
    <2010年11月>
    31123456
    78910111213
    14151617181920
    21222324252627
    2829301234
    567891011

          生活將我們磨圓,是為了讓我們滾得更遠——“圓”來如此。
          我的作品:
          玩轉Axure RP  (2015年12月出版)
          

          Power Designer系統分析與建模實戰  (2015年7月出版)
          
         Struts2+Hibernate3+Spring2   (2010年5月出版)
         

    留言簿(263)

    隨筆分類

    隨筆檔案

    文章分類

    相冊

    關注blog

    積分與排名

    • 積分 - 2294803
    • 排名 - 3

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 免费国产成人18在线观看| 久久精品无码专区免费东京热| 国产亚洲情侣一区二区无码AV| a级成人毛片免费视频高清| 亚洲欧洲自拍拍偷综合| 国产成人无码免费视频97 | 亚洲日韩中文字幕一区| 亚洲美女高清一区二区三区 | 国产亚洲成在线播放va| 亚洲国产精品成人精品无码区在线| 四虎在线成人免费网站| 尤物视频在线免费观看| 亚洲成a人片7777| 亚洲第一成人影院| 黄在线观看www免费看| 成人妇女免费播放久久久| 亚洲一区二区三区播放在线| 亚洲婷婷国产精品电影人久久| 黄色永久免费网站| 中国国语毛片免费观看视频| 亚洲人成色在线观看| 亚洲午夜久久影院| 中文字幕精品亚洲无线码一区 | 亚洲高清无码专区视频| 91免费人成网站在线观看18| 香蕉视频在线免费看| 亚洲爆乳成av人在线视菜奈实| 亚洲午夜免费视频| 国产福利电影一区二区三区,亚洲国模精品一区| 18禁止看的免费污网站| 中文在线免费视频| 青青青视频免费观看| 亚洲欧美国产国产综合一区| 亚洲最大免费视频网| 图图资源网亚洲综合网站| 久久亚洲国产成人影院网站| 一本色道久久88综合亚洲精品高清| 毛片免费在线观看网站| 黄色网址免费观看| 日本免费人成在线网站| 84pao国产成视频免费播放|