DB2併發性和事務隔離級別

1.當事務在多用戶環境中沒有彼此隔離時,將會產生以下三種後果:
1)髒讀

這種情況發生在一個事務讀取還未提交的數據時。例如: 事務1改變了一行數據,而在事務1提交修改之前事務2讀取了事務1所改變的行的數據。如果事務1回滾了修改,那末事務2就讀取了實際上並不存在的數據。
2)不可重複讀
這種情況發生在事務兩次讀取同一行中的數據卻得到不同數值時。例如: 事務1讀取了一行數據,而事務2改變或刪除了那些行並提交了修改。如果事務1再次讀取了那一行,那麼,事務1就得到了不同的數值(如果那一行被更新)或發現那一行已不存在(如果那一行被刪除)。
3)幻影數據
這種情況發生在一行數據滿足搜索規則,卻在開始沒有被看到時。 例如:事務1讀取了一系列滿足搜索規則的行,而事務2插入了一個滿足事務1搜索規則的行。如果事務1再次執行查詢語句,就會得到不同的一系列行。
      在允許多個應用程序同時訪問同一數據時,應該保持數據庫的一致性和數據完整性。這稱爲“併發”(concurrency)。
DB2使用四個不同的事務隔離級別來實現併發。一個隔離級別決定當數據被訪問時,如何鎖定數據或讓數據與其他進程隔離。DB2支持以下隔離級別:
     ·可重複讀
     ·讀穩定性
     ·遊標穩定性
     ·未提交讀

 

2.隔離級別

    與應用程序進程相關聯的隔離級別定義了進程與其他併發執行的應用程序進程相隔離的等級。隔離級別被指定爲應用程序進程使用的包的屬性。(package)是在執行 BIND、PRECOMPILE 或 REBIND 命令期間創建的數據庫對象,其中包含 SQL 編譯器輸出,並用於執行 SQL 語句。在您預編譯(準備)應用程序時,或者將應用程序綁定到數據庫時,可以指定一個適當的隔離級別。

  • 當應用程序是預編譯的(precompiled)時,嵌入式 SQL 語句將會被可以提交給 SQL 編譯器的源代碼所取代。
  • 當應用程序是被綁定到(bound to)數據庫的時候,SQL 編譯器輸出被轉換到一個包中。

DB2 UDB 支持以下隔離級別:

  • 可重複讀(Repeatable read,RR) 確保工作單元(UOW)期間的任何錶行讀操作直到 UOW 完成,不會被其他應用程序進程更改。類似地,由另一個應用程序進程更改的任何行直到由該應用程序進程提交,不會被讀取。運行在 RR 級別的應用程序進程是完全與併發應用程序進程的效果相隔離的
  • 讀穩定性(Read stability,RS)類似於 RR。但是,運行在 RS 級別的應用程序進程不是 完全與併發應用程序進程的效果相隔離的。如果這樣的應用程序進程不止一次發出同樣的查詢,它就會看到更改了的數據或者由其他應用程序進程添加的新的“幻影(phantom)”行。
  • 遊標穩定性(Cursor stability,CS)也確保由另一個應用程序進程更改的任何行直到被那個應用程序進程提交,不會被讀取。但是 CS 隔離級別只確保每個可更新遊標當前行 不被其他應用程序進程更改;在 UOW 期間讀過的行可以被其他應用程序進程更改。
  • 未提交讀(Uncommitted read,UR)對於某些操作,允許在 UOW 期間讀過的任何行可以被其他應用程序進程更改,並允許讀任何被另一個應用程序進程更改過的行,即使該更改還沒有提交。對於其他操作,UR 類似於 CS。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章