在 DB2 9.7 使用光標穩定性隔離級別之前,一個寫操作(UPDATE)將阻止同一行的讀操作
(SELECT)。其中的邏輯是,寫操作正在修改行,讀操作應該等到更新完成後看到最終提交的值。
在DB2 9.7 中,有一個新數據庫的游標穩定性隔離級別的默認行為。實施這一新的行為時,將使用當
前提交CC(currently committed)的語義。有CC 之後寫操作不會阻止訪問同一行中的讀操作。如
果您使用了隔離級別未提交的讀操作(UR),這種情況過去是可能發生的。但現在的差別是,UR 讀
操作讀到的是未提交的值, CC 讀操作讀到的是提交的值。當前提交值是致力於寫操作的開始前的
值。例如,表T1 具有以下內容:
FIRSTNAME LASTNAME
Raul Chong
Jin Xie
現在,您的應用程序AppA 執行這個語句,但不提交:
update T1 set lastname = 'Smith' where firstname = 'Raul'
接下來,應用程序AppB 執行此提交:
select lastname from T1 where firstname = 'Raul' with CS
在 DB2 9.7 之前,這條語句將掛起,因為它正在等待由AppA(寫操作)更新語句的排他鎖被釋放。
在DB2 9.7 當前提交(新數據庫默認)能讓語句返回當前提交的值,即Chong。請注意,即使CS
是默認值,為清楚起見我們還是把”with CS”包括在提交語句中。我們將在後一章節討論這個子句。 www.2cto.com
如果AppB 嘗試這個語句:
select lastname from T1 where firstname = 'Raul' with UR
由於UR 的隔離使用,其結果將是未提交的值Smith 。這個例子說明, CC 程序具有更好的並發功
能使讀操作能夠讀到一個正在更新的行。另一個在DB2 9.7 之前會引起爭議的情況是讀操作阻止寫操
作訪問行。這就是為什麼即使是讀操作也建議使用一個提交的原因之一,因為這將確保共享(S)鎖
被釋放。有了CC 之後這不再是一個問題,讀操作不會阻塞寫操作。對於那些沒有提交的INSERT 操
作,讀操作將默認地跳過他們,結果就是不顯示這些行。對於DELETE 命令,讀操作應該也可以跳
過(忽略)受影響的行,但行為取決於DB2 注冊表的變量值DB2_SKIPDELETED。其他注冊表變量
和BIND 和PREPARE 命令屬性可以改變CC 的默認行為。記住:當前提交意味著它只會顯示當前提
交的信息,因此未提交的INSERT 或DELETE 操作將被忽略。如前所述,在新數據庫CC 是默認
的。如果您想將其關閉,或把一個早期版本創建的數據庫升級到DB2 9.7,您可以更新數據庫配置
CUR_COMMIT 的值。例如,將SAMPLE 數據庫的CC 關閉可以寫成:
db2 update db cfg for sample using CUR_COMMIT off
db2stop
db2start
作者 TOMSYAN