DB2之隔離級別


文章來源:http://blog.csdn.net/msoso_______1988/article/details/9248535    

  在DB2中,共有四種隔離級:RS,RR,CS,UR.以下對四種隔離級進行一些描述,同時附上個人做試驗的結果。隔離級是影響加鎖策略的重要環節,它直接影響加鎖的范圍及鎖的持續時間。兩個應用程序即使執行的相同的操作,也可能由於選擇的隔離級的不同而造成加鎖的結果不同。

  在DB2中,共有四種隔離級:RS,RR,CS,UR.以下對四種隔離級進行一些描述。

讀可靠性(RS-Read Stability)
  如果使用這種隔離級,在一個事務中所有被讀取過的行上都會被加上NS鎖,直到該事務被提交或回滾,行上的鎖才會被釋放。這樣可以保證在一個事務中即使多次讀取同一行,得到的值不會改變。

  但其他事務可以插入,可以防止db2定義的不可重復讀,但有幻讀問題。即如果使用這種隔離級,在一個事務中,如果使用同樣的搜索標准重新打開已被處理過的游標,則結果集可能改變。(可能會增加某些行,這些行被稱為幻影行(Phantom))。這是因為RS隔離級不能阻止通過插入或更新操作在結果集中加入新行。

  個人筆記:

   根據實際測試情況,RS模式下:查詢完畢以后,滿足條件的結果集中的記錄被鎖定,不滿足條件的不被鎖定。

   可以對不滿足條件的記錄更新,也可以插入新的記錄。其他人可以查詢滿足已經鎖定的記錄,但不可以更新。

重復讀(RR-Repeat Read)
  如果使用這種隔離級,在一個事務中所有被讀取過的行上都會被加上S鎖,知道該事務被提交或回滾,行上的鎖才會被釋放。這樣可以保證在一個事務中即使多次讀取同一行,得到的值不會改變。

  另外,在同一事務中如果以同樣的搜索標准重新打開已被處理過的游標,得到的結果集不會改變。重復讀相對於讀可靠性而言,加鎖的范圍更大。

  解決幻讀。鎖定讀事務以任何方式引用的所有行,整個表加S鎖。相當於serializable讀寫用鎖互斥  

  對於讀可靠性,應用程序只對符合要求的所有行加鎖,而對於重復讀,應用程序將對所有被掃描過的行都加鎖。例如,如果一個應用程序對一個表中的 10000行數據進行掃描,最終找到了100條符合搜索條件的結果行。如果該應用程序使用的是讀可靠性隔離級,應用程序將只對這符合條件的100行加鎖;如果該應用程序使用的是重復讀隔離級,應用程序將對被掃描過的10000行都加鎖。

  個人筆記

   根據實際測試情況,RR模式下:查詢完畢以后,不可以對不滿足條件的進行更新,也不可以插入新記錄。可能原因是:如果允許別人更新記錄或者插入新記錄的話,則可能造成原來結果集的破壞,重新讀的時候和以前不同。

   select for update with rr/rs 是可以用來實現記錄鎖。是一種特殊情況。即便是RR,仍然可以對其他記錄操作。

游標可靠性(CS-Cursor Stability)
  如果使用這種隔離級,在一個事務中,結果集中只有正在被讀取的那一行(游標指向的行)將被加上NS鎖,其他未被處理的行上不被加鎖。這種隔離級只能保證正在被處理的行的值不會被其他並發的程序所改變。該隔離級是DB2缺省的隔離級。防止臟讀。其他事務不能更新/刪除游標當前所引用的行。可能出現db2定義的不可重復讀和幻讀。

  個人筆記

  僅僅在游標在該行的時候鎖定,這是一種非常弱的隔離狀態。

未提交讀(UR-Uncommitted Read)
  如果使用這種隔離級,對於只讀操作,不加行鎖。典型的只讀操作包括:

   SELECT語句的結果集只讀(比如語句中包括ORDER BY子句);

  定義游標是指明起為FOR FETCH ONLY。

  該隔離級可以改善應用程序的性能,同時可以最大程度的允許並發。但是,應用程序的數據完整性將受到威脅。如果需要讀取未提交的數據,該隔離級是唯一選擇。

  個人筆記

  讀的時候完全不受限制,對於同一行記錄的完整性也無法保證。

  總結

  以上我們所提的隔離級的加鎖范圍和持續時間都是針對於讀操作而言的。

  對於更改操作,被修改的行上會被加上X鎖,不論使用何種隔離級,X鎖直到提交或回滾之后才會被釋放。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM