我們大家都知道DB2 V9.7 數據庫,其引入了一系列新的特性,這些新的特征的出現會使客戶可以更輕松地節省 IT 成本。起具體的特性包括壓縮增強、pureXML 增強、易用性增強、監控增強、工作負載管理增強。
安全性提高、性能提高、應用開發提高、SQL PL 語言支持、SQL 兼容性提高和高可用、備份、日志、彈性、恢復提高等。
本文的重點是介紹“當前已落實”新特性,該新特性的顯著特點是在游標穩定性隔離級別時可以明顯減少鎖等待的出現,以及死鎖的出現頻率。通過使用“當前已落實”的 CS 隔離級別,可以有效提升高吞吐量事務處理環境下的數據庫性能。
從 DB2 V9.7 開始,DB2 通過采用完全鎖定避免技術,當能夠明確獲得數據或者頁的“已落實”版本時,允許掃描避免使用行級鎖。當無法獲知索引或行記錄是否已落實時,掃描將改用使用傳統的鎖定方式。未提交的插入行在行級鎖中是直接被標識的,允許“當前已落實”掃描直接忽略或跳過該行。
簡介
從 IBM DB2 V9.7 開始,DB2 引入了一系列新特性,使客戶可以更輕松地節省 IT 成本。具體包括壓縮增強通過對 XML 數據、臨時表、索引、數據復制源表的壓縮支持,進一步減少了對存儲的需求,提高了 I/O 的效率,提高了對磁盤數據的快速訪問)、pureXML 增強通過對 pureXML 功能的進一步增強,使得數據倉庫中可以部署和分析 XML 數據;
現在 XML 可以在表分區、MDC 表、臨時表、用戶函數、分區數據庫環境中使用)、易用性增強通過對易用性的增強,減少了總體擁有成本 TCO,減少了執行系統管理任務對系統的影響,擴展了以前版本發布的自治特性)、監控增強可以更靈活、更高粒度的監控 DB2 環境)、工作負載管理增強新增調配正在進行的活動的優先級、與 Linux 工作負載管理 WLM 集成、對服務類提高緩沖池中 I/O 優先級控制等。
新增了 AGGSQLTEMPSPACE、CPUTIME、CPUTIMEINSC、SQLROWSREAD、SQLROWSREADINSC 等阈值,改進了基於時間的阈值 ACTIVITYTOTALTIME、CONNECTIONIDLETIME 的粒度)、安全性提高可以對敏感數據進行更好的保護)、性能提高通過在游標穩定性隔離級別下引入“當前已落實”、掃描共享、在表分區上創建分區索引、在表中存儲內嵌 LOB 文件等提高了對數據的訪問速度,增加了數據的並發性;
DB2 優化器通過訪問計劃重用、Statement concentrator 支持等增強了 DB2 的性能)、應用開發提高通過“使用 ALTER TABLE 重命名列名”等簡化了數據庫對象的管理,通過引入 TRUNCATE 語句、創建臨時表、公共同義詞等很多新的功能提高了 SQL 編程、存儲過程開發得到了簡化和提高等)、SQL PL 語言支持、SQL 兼容性提高可以從諸如 ORACLE 應用程序等更容易的遷移到 DB2 環境中)和高可用、備份、日志、彈性、恢復提高等。
本文的重點是介紹“當前已落實”currently committed semantics,以後會簡稱 CC)新特性,該新特性的顯著特點是在游標穩定性Cursor stability,以後會簡稱 CS)隔離級別時可以明顯減少鎖等待的出現,以及死鎖的出現頻率。
在 DB2 V9.7 之前的版本中,當我們使用游標穩定性隔離級別默認的隔離級別)時,一般只鎖定事務聲明並打開的游標當前引用的行,也就是說該事務一般只鎖定當前行,對當前行以外的記錄不做鎖定;對其所獲取的鎖一直有效,直到游標重定位或事務終止為止 。如果游標重定位,原來行上的鎖就被釋放,並獲得游標現在引用的行上的鎖 。
如果事務修改了它檢索到的任何行,那麼在事務終止之前,其他事務不能更新或刪除該行,即使游標不再位於被更新或刪除的行 。需要注意:如果只檢索的話,一般只鎖定當前行;如果對檢索的行還進行了更新或刪除的話,則對修改的行也進行了鎖定,即便指針移向了其他行,對修改行的鎖定還是存在。而對修改行的鎖定會阻止其他應用程序讀取該行,直到對修改行的鎖定解除後對該修改落實後),其他應用才能讀取該行。
我們首先來看一下 ORACLE 在 Snapshot 隔離級別下讀操作與寫操作堵塞的情況,具體如表格 1 所示,當讀操作遇上讀操作、讀操作遇上寫操作和寫操作遇上讀操作都不會發生堵塞,而寫操作遇上寫操作時則會發生堵塞:
ORACLE Snapshot 隔離級別情況下的的堵塞情況
先出現的工作負載 \ 後出現的工作負載 讀工作負載 寫工作負載
讀工作負載 否不堵塞) 否不堵塞)
寫工作負載 否不堵塞) 是堵塞)
下面我們看一下在 DB2 V9.7 之前的版本中使用游標穩定性隔離級別時讀操作與寫操作堵塞的情況,具體如表格 2 所示,當讀操作遇上讀操作時不會發生堵塞;當讀操作遇上寫操作時可能會發生堵塞FOR READ ONLY 的讀操作不會堵塞寫操作,而 FOR UPDATE 的讀操作由於其行上有 U 鎖,會堵塞寫操作);當寫操作遇上讀操作時一定會發生堵塞,而當寫操作遇上寫操作時同樣會發生堵塞。
DB2 V9.7 之前的版本中使用 CS 隔離級別情況下的堵塞情況
先出現的工作負載 \ 後出現的工作負載 讀工作負載 寫工作負載
讀工作負載 否不堵塞) 可能
寫工作負載 是堵塞) 是堵塞)
再看一下在 DB2 V9.7 中,啟用“當前已落實”的游標穩定性隔離級別時的讀操作與寫操作堵塞的情況,具體如表格 3 所示,可以看到比 DB2 之前的版本有了明顯的改進,當讀操作遇上讀操作、讀操作遇上寫操作和寫操作遇上讀操作都不會發生堵塞,只有寫操作遇上寫操作時才會發生堵塞:
DB2 V9.7 中啟用“當前已落實”的 CS 隔離級別情況下的堵塞情況
先出現的工作負載 \ 後出現的工作負載 讀工作負載 寫工作負載
讀工作負載 否不堵塞) 否不堵塞)
寫工作負載 否不堵塞) 是堵塞)
在 DB2 V9.7 中,在游標穩定性隔離級別下,通過啟用“當前已落實”新特性,一個讀操作已經不需要再等待該變更落實後再返回值,而是直接返回該行未變更前的值也就是當前已落實的結果值,忽略任何可能發生的未落實操作)。不過需要注意的是在可更新游標中存在例外的情況:如果某行基於它自己之前的內容被更新過,當前已落實結果無法立即返回。
在游標穩定性隔離級別使用行級鎖的情況沒有啟用“當前已落實”)下,可能會出現鎖定超時和死鎖,特別是那些沒有為防止這些問題進行特殊設計的應用程序。某些高吞吐量數據庫應用程序不能容忍事物處理過程中的鎖等待,某些應用不能容忍處理未提交的數據,但仍然需要不堵塞讀操作事務。
通過在 CS 隔離級別下啟用“當前已落實”,可以有效提高高吞吐量事務處理環境下的數據庫性能。在這些環境中,過多的鎖等待是不能容忍的,通過啟用“當前已落實”的 CS 隔離級別,可以有效的減少 timeout 和 deadlocks 。在“當前已落實”啟用的情況下,只有落實的數據才會被返回,就像之前的例子,現在讀操作不需要再等待更新操作釋放行級鎖了,讀操作將直接返回“當前已落實”版本的數據也就是首次寫操作之前的值)。
由於“當前已落實”是 DB2 V9.7 的新特性,很多客戶不知道該如何使用,本文將重點介紹 DB2 V9.7 關於“當前已落實”新特性以及相關的概念,並結合實際的例子幫助大家理解和提高。
當前已落實Currently Committed) 工作原理
從 DB2 V9.7 開始,DB2 通過采用完全鎖定避免full lock avoidance techniques)技術,當能夠明確獲得數據或者頁的“已落實”版本時,允許掃描避免使用行級鎖。當無法獲知索引或行記錄是否已落實時,掃描將改為使用傳統的鎖定方式。 DB2 通過在行級鎖定中增加新的反饋機制,來標識哪些“日志記錄”描述了該行的首次修改從該行的首次修改,就可以獲得修改前的數據值,也就是該行的已落實版本),當發生一個鎖沖突時鎖管理器將使用該反饋機制直接返回這些日志記錄編號。
一個當前已落實掃描將用使用該反饋結果,用來從日志日志緩沖區中或者活動日志文件中)訪問該行的“當前已落實”版本也就是首次更新之前的結果值)。未提交的插入行在行級鎖中是直接被標識的,允許“當前已落實”掃描直接忽略或跳過該行。
具體如圖 1 所示,emp 表有 5 條記錄,其中第二行和第四行插入操作已經完成,描述該插入操作的日志記錄已經存儲在使用 TSM 歸檔的帶庫中,具體如圖 1 中右下方紅色部分所示;第三行正處於更新狀態還沒落實),記錄該行的日志記錄處於磁盤中的活動日志文件中,該日志記錄描述了第三行的首次更改情況,具體如圖 1 右邊中間黃色部分所示;
第五行正處於插入狀態還沒落實),記錄該行的日志記錄處於磁盤中的活動日志文件中,該日志記錄描述了第五行的首次插入情況,具體如圖 1 右邊中間黃色部分所示;第一行正處於刪除狀態還沒落實),記錄該行的日志記錄處於日志緩沖區中,該日志記錄描述了第一行的首次更改情況,
具體如圖 1 右邊上方綠色部分所示;圖 1 中間的 Locklist 部分表示鎖管理器,在鎖管理器中描述了第一行、第三行、第五行處於 X 鎖狀態,與這些行對應的日志記錄也在該鎖管理器中,這就是 DB2 V9.7 對行級鎖定新增的反饋機制,來標識哪些“日志記錄”描述了該行的首次修改。
當發生一個鎖沖突時鎖管理器將使用該反饋機制直接返回這些日志記錄編號,如黑色箭頭所示。當其他應用試圖讀取第一行或第三行時,將會直接從日志緩沖區或日志文件中返回該行的“已落實”版本數據。而對未提交的第五行,掃描將直接忽略或跳過該行。