DB2的樂觀鎖定新特性
本文將為您介紹DB2數(shù)據(jù)庫9的全新樂觀鎖定特性,可以使DB2 能夠檢索特定時間段內(nèi)的行,能夠了解它們的最后修改時間,具有很好的輔助效果。
DB2 for z/OS 客戶正在將新的、尖端的數(shù)據(jù)倉庫任務(wù)添加到傳統(tǒng)OLTP 中。
為支持多個系統(tǒng)以及應(yīng)對那些往往缺乏真知灼見的應(yīng)用程序開發(fā)人員和主管,使得 DBA 工作充滿挑戰(zhàn)。幸運的是,DB2 9 for z/OS 提供了一種全新的樂觀鎖定特性,可以提高系統(tǒng)性能——或許也能使 DBA(和應(yīng)用程序開發(fā)人員)的心態(tài)樂觀起來。
數(shù)據(jù)庫鎖定是必不可少的開銷,也是所有 DBMS 的核心組件。鎖通過防止多個事務(wù)在同一時間更改相同的數(shù)據(jù)來維護數(shù)據(jù)完整性。但獲取和維護數(shù)據(jù)庫鎖的成本可能非常高昂,對于復(fù)雜的系統(tǒng)、應(yīng)用程序或事務(wù)來說更是如此。
樂觀鎖定現(xiàn)使用 DB2 表中定義的新特性來減少死鎖、降低總體鎖定開銷,并提升系統(tǒng)和應(yīng)用程序的性能。
要使用樂觀鎖定的新特性,您需要使用新參數(shù)(GENERATED ALWAYS、FOR EACH ROW ON UPDATE、AS ROW CHANGE TIMESTAMP)在DB2表內(nèi)定義新的 ROW CHANGE TIMESTAMP 列,如下所示:
清單 1. 使用樂觀鎖定的新特性
CREATE TABLE BEULKE.PRODUCT_TBL (
PROD_NBR INTEGER NOT NULL,
PROD_INVENTORY INTEGER NOT NULL,
PROD_LAST_UPD NOT NULL
GENERATED ALWAYS
AS ROW CHANGE
TIMESTAMP);
這些參數(shù)告訴 DB2,應(yīng)該總是填充并特別注意時間戳和表。最后更新的時間戳已經(jīng)內(nèi)嵌在某些應(yīng)用程序中多年了;IBM 如今承認并改進了這種技術(shù)。
這些新特性使DB2 能夠檢索特定時間段內(nèi)的行,能夠了解它們的最后修改時間。DB2 不僅關(guān)注行時間戳信息,還關(guān)注記錄 ID(RID)和變更標記信息。關(guān)注行屬性使應(yīng)用程序和用戶能夠通過時間戳查詢數(shù)據(jù)庫,根據(jù) WHERE 時間戳子句標準獲取一個特定的行或一組行。
新的列特性允許大多數(shù)應(yīng)用程序回彈從而降低了鎖定開銷,還將鎖定配置文件從 Repeatable Read(RR)、Read Stability(RS)或Cursor Stability(CS)還原為 Uncommitted Read(UR)。Uncommitted Read 避免了數(shù)據(jù)庫鎖定;應(yīng)用程序可以通過在應(yīng)用程序 UPDATE SQL 語句中使用新的時間戳列來維護數(shù)據(jù)庫事務(wù)完整性。新時間戳列提供了行的時間戳和記錄 ID(RID),DB2 可用此信息來驗證無其他應(yīng)用程序更改了所需數(shù)據(jù)。
另外一條 DB2 9 SQL 短語——SKIP LOCKED DATA,也有助于避免鎖定,因為它不會使用不兼容的鎖來檢索或影響數(shù)據(jù)行??梢栽?SELECT、UPDATE 和 DELETE 等 SQL 語句中使用該短語來避免死鎖。使用隔離級別的 UR 和 SKIP LOCKED DATA 短語時應(yīng)倍加謹慎。盡管這些技術(shù)能夠顯著減少鎖定數(shù)量、提升性能,但需要您透徹理解自己的應(yīng)用程序。在使用這種性能提升技術(shù)之前,應(yīng)詳細研究每一個應(yīng)用程序,還應(yīng)閱讀 DB2 手冊,查看所有細節(jié)。由于這些技術(shù)能夠大幅減少死鎖和鎖定開銷——特別是在數(shù)據(jù)共享環(huán)境中,因此值得為此付出研究和實現(xiàn)的時間。