CREATE TABLE LockTable(ResourceId CHAR(10));
INSERT INTO LockTable VALUES('INDEX 1');
INSERT INTO LockTable VALUES('INDEX 2');
上面的示例演示如何在鎖表中填充兩個(gè)全文索引資源。每個(gè)索引不能由一個(gè)以上的應(yīng)用程序使用。這意味著,應(yīng)用程序 1 可能使用索引 1,同時(shí)應(yīng)用程序 2 使用索引 2,但是不答應(yīng)兩個(gè)應(yīng)用程序中同時(shí)使用索引 1 ?! ∈褂面i定/解鎖協(xié)議訪問資源 引入一個(gè)由兩個(gè)函數(shù) lock(ResourceId) 和 unlock() 組成的協(xié)議,所有應(yīng)用程序都需要遵守這個(gè)協(xié)議。具體的接口依靠于實(shí)現(xiàn)語言,在這里無關(guān)緊要。要害的一點(diǎn)是,所有應(yīng)用程序在訪問會(huì)話鎖控制的資源 之前,必須調(diào)用 lock(resourceId)。當(dāng)不再需要這個(gè)資源時(shí),它們應(yīng)該調(diào)用 unlock()?! ?shí)現(xiàn) lock() 函數(shù) lock() 函數(shù)的實(shí)現(xiàn)必須確保調(diào)用者能夠立即得到請求的結(jié)果(授予鎖還是不授予鎖)。另外,授予的鎖必須不受應(yīng)用程序中 DB2 事務(wù)的影響。因此,lock() 的實(shí)現(xiàn)必須在一個(gè)單獨(dú)的線程中打開額外的 DB2 連接。所以,lock() 函數(shù)的實(shí)現(xiàn)由以下步驟組成: 上一頁123下一頁 啟動(dòng)一個(gè)對鎖請求進(jìn)行處理的子線程。 等待子線程發(fā)出表示鎖請求處理完成的信號,這時(shí)結(jié)果已經(jīng)可用了。 在子線程中,打開新的 DB2 連接,在鎖表中獲取具有所請求的資源 ID 的一行。在這里,使用 SKIP LOCKED DATA 特性只獲得未被 DB2 鎖定的行(例如,假如另一個(gè)應(yīng)用程序持有這個(gè)資源上的會(huì)話鎖,就不能獲得這一行)。DB2 并不在獲取操作中等待。見 清單 2 中的示例代碼?,F(xiàn)在,請求的結(jié)果必須在主線程中可用。子線程等待主線程的終止信號。假如授予了會(huì)話鎖,它就持有鎖表中一行上的 DB2 更新鎖,直到發(fā)生以下情況為止: 調(diào)用 unlock() 或者 應(yīng)用程序終止。 lock() 函數(shù)主線程從子線程獲得結(jié)果。假如授予了鎖,那么 lock() 函數(shù)返回調(diào)用者。否則子線程被終止?! ∏鍐?2. 在子線程中實(shí)現(xiàn) lock() 的 SQL 代碼
DECLARE C1 CURSOR FOR
SELECT ResourceId FROM LockTable WHERE ResourceId=:resourceId
FOR UPDATE WITH CS SKIP LOCKED DATA;
OPEN C1;
FETCH C1;
if (sqlca.sqlcode==NO_DATA_FOUND) {
result=indexAlreadyLocked;
} else {
result=lockGranted;
}
實(shí)現(xiàn) unlock() 函數(shù) 提供一個(gè) unlock() 函數(shù),它將終止仍然持有鎖表中某一行的 DB2 更新鎖的子線程。子線程中的終止代碼關(guān)閉 SQL 游標(biāo),并使事務(wù)回滾,見 清單 3。因此,會(huì)釋放這一行的 DB2 更新鎖,清單 2 中的下一個(gè) SQL select 語句會(huì)看到這一行?! ∏鍐?3. 在子線程中實(shí)現(xiàn) unlock() 的 SQL 代碼 CLOSE C1;
ROLLBACK WORK;
控制同時(shí)訪問一個(gè)資源的應(yīng)用程序數(shù)量 對以上方式做一項(xiàng)簡單的修改,就可以控制同時(shí)訪問一個(gè)資源集的應(yīng)用程序數(shù)量: 假如鎖表中有重復(fù)的行,就可以對資源進(jìn)行并發(fā)使用。鎖表中一個(gè)資源的行數(shù)決定了可以同時(shí)訪問這個(gè)資源的最大應(yīng)用程序數(shù)量?! ∏鍐?4. 填充鎖表來控制同時(shí)訪問的最大應(yīng)用程序數(shù)量的 SQL 示例 INSERT INTO LockTable VALUES('INDEX 1');
INSERT INTO LockTable VALUES('INDEX 1');
INSERT INTO LockTable VALUES('INDEX 2');
INSERT INTO LockTable VALUES('INDEX 2');
INSERT INTO LockTable VALUES('INDEX 2');
按照這段代碼,最多有兩個(gè)應(yīng)用程序可以同時(shí)訪問 ‘INDEX 1’,最多有三個(gè)應(yīng)用程序可以同時(shí)訪問 ‘INDEX 2’?! 〗Y(jié)束語 有一種簡單可靠的解決方案模式可用于在應(yīng)用程序級別實(shí)現(xiàn)會(huì)話鎖。它依靠于 DB2 Version 9.1 for z/OS 中的新特性 SKIP LOCKED DATA,且已成功應(yīng)用于一個(gè) DB2 開發(fā)項(xiàng)目。 上一頁123 新聞熱點(diǎn)
疑難解答
圖片精選