成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

用DB2 V9.1for z/OS實現應用程序會話鎖定

瀏覽:124日期:2023-11-09 13:05:40
DB2 for z/OS V9.1 的一項新特性 SKIP LOCKED DATA 使用戶能夠實現應用程序級別的會話鎖定,允許在中途進行 DB2 提交。通過本文介紹的簡便設計模式,熟悉這個特性的細節。

簡介

對于獲得最佳的應用程序性能,以及確保數據完整性和一致的應用程序行為來說,數據庫鎖定策略是非常重要的。在 Paul Ilechko 的文章 “Locking strategies for database access”(developerWorks,2006 年 3 月)中,他描述了進行數據庫鎖定的邏輯會話鎖定方式。除了事務鎖定之外,這種方式可以在更高的級別上控制應用程序的并發性。

很難實現消極會話鎖定方式的 bullet-proof 實現。但是,利用 DB2 Version 9.1 for z/OS 中引入的新特性 SKIP LOCKED DATA(這個特性最初是為另一個完全不同的用途設計的,即避免鎖定),可以實現一種簡單可靠的解決方案。

問題陳述

在許多場景中,應用程序級別上的并發性控制是必要的,例如:

確保在一組不可共享的資源上工作的應用程序互斥。一個真實的示例是,一個存儲過程使 DB2 外部的全文索引與 DB2 中存儲的數據同步。在這里,受控制的資源是全文索引。它由索引名稱標識,索引名稱是存儲過程的一個參數。只有在索引名稱參數不同的情況下,才允許并行調用這個存儲過程。

控制同時對一個資源集進行操作的應用程序的最大數量。

對于消極會話鎖定,按照慣例,應用程序需要兩個函數 lock(resource) 和 unlock()。

下面是對解決方案的一些需求,這些需求使解決方案在應用程序級別難以實現:

1.解決方案必須為在應用程序之間可見的每個資源提供一個概念性的會話鎖。

2.即使持有會話鎖的應用程序非正常終止,解決方案也必須保證會話鎖被釋放。

3.鎖定或解鎖機制必須獨立于應用程序中的 DB2 事務(也就是說,中途事務提交不能產生釋放會話鎖的副作用)。

4.解決方案必須避免會話鎖超時和長時間等待鎖。lock() 函數必須立即進行檢查并返回(非阻塞方式)。

基于 DB2 事務鎖的任何會話鎖定實現必須解決鎖沖突問題。事務鎖沖突可以導致事務回滾(sqlcode -911),或者導致不確定地等待鎖。如果沒有 SKIP LOCKED DATA 這樣的數據庫概念,這個問題是很難解決的。

解決方案的模式

作為一個解決方案,建議定義一個 DB2 表,其中包含資源標識符的列表,并在所有應用程序對資源的訪問中使用鎖定和解鎖協議。lock() 函數的實現在一個 SQL fetch 語句中使用 DB2 新功能 skipping locked data。這是該解決方案的關鍵。

為資源鎖定創建一個DB2表

創建一個 DB2 表(在下文中稱為 鎖表(lock table)),它定義與會話鎖定相關的資源。假設邏輯會話鎖的范圍是某種資源標識符。在上面的全文索引示例中,這個標識符是索引名稱。對于每個資源,在這個表中插入一行。

清單1. 創建鎖表的SQL示例

CREATE TABLE LockTable(ResourceId CHAR(10));

INSERT INTO LockTable VALUES('INDEX 1');

INSERT INTO LockTable VALUES('INDEX 2');

上面的示例演示如何在鎖表中填充兩個全文索引資源。每個索引不能由一個以上的應用程序使用。這意味著,應用程序 1 可能使用索引 1,同時應用程序 2 使用索引 2,但是不允許兩個應用程序中同時使用索引1。

使用鎖定/解鎖協議訪問資源

引入一個由兩個函數 lock(ResourceId) 和 unlock() 組成的協議,所有應用程序都需要遵守這個協議。具體的接口依賴于實現語言,在這里無關緊要。關鍵的一點是,所有應用程序在訪問會話鎖控制的資源 之前,必須調用 lock(resourceId)。當不再需要這個資源時,它們應該調用 unlock()。

實現 lock() 函數

lock() 函數的實現必須確保調用者能夠立即得到請求的結果(授予鎖還是不授予鎖)。另外,授予的鎖必須不受應用程序中 DB2 事務的影響。因此,lock() 的實現必須在一個單獨的線程中打開額外的 DB2 連接。所以,lock() 函數的實現由以下步驟組成:

1.啟動一個對鎖請求進行處理的子線程。

2.等待子線程發出表示鎖請求處理完成的信號,這時結果已經可用了。

3.在子線程中,打開新的 DB2 連接,在鎖表中獲取具有所請求的資源 ID 的一行。在這里,使用 SKIP LOCKED DATA 特性只獲得未被 DB2 鎖定的行(例如,如果另一個應用程序持有這個資源上的會話鎖,就不能獲得這一行)。DB2 并不在獲取操作中等待。見 清單 2 中的示例代碼。現在,請求的結果必須在主線程中可用。子線程等待主線程的終止信號。如果授予了會話鎖,它就持有鎖表中一行上的 DB2 更新鎖,直到發生以下情況為止:

調用 unlock() 或者

應用程序終止。

4.lock() 函數主線程從子線程獲得結果。如果授予了鎖,那么 lock() 函數返回調用者。否則子線程被終止。

清單2. 在子線程中實現 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;

}

實現 unlock() 函數

提供一個 unlock() 函數,它將終止仍然持有鎖表中某一行的 DB2 更新鎖的子線程。子線程中的終止代碼關閉 SQL 游標,并使事務回滾,見 清單 3。因此,會釋放這一行的 DB2 更新鎖,清單 2 中的下一個 SQL select 語句會看到這一行。

清單3. 在子線程中實現 unlock()的SQL代碼

CLOSE C1;

ROLLBACK WORK;

控制同時訪問一個資源的應用程序數量

對以上方式做一項簡單的修改,就可以控制同時訪問一個資源集的應用程序數量:

如果鎖表中有重復的行,就可以對資源進行并發使用。鎖表中一個資源的行數決定了可以同時訪問這個資源的最大應用程序數量。

清單 4. 填充鎖表來控制同時訪問的最大應用程序數量的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');

按照這段代碼,最多有兩個應用程序可以同時訪問 ‘INDEX 1’,最多有三個應用程序可以同時訪問 ‘INDEX 2’。

結束語

有一種簡單可靠的解決方案模式可用于在應用程序級別實現會話鎖。它依賴于 DB2 Version 9.1 for z/OS 中的新特性 SKIP LOCKED DATA,且已成功應用于一個 DB2 開發項目。

標簽: DB2 數據庫
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产精品普通话对白| 91精品国产综合久久精品app| 国产日韩高清一区二区三区在线| 日韩一二三区视频| 毛片基地黄久久久久久天堂| 国产精品二区在线| 欧美精品丝袜久久久中文字幕| 亚洲一区欧美一区| 欧美日韩精品伦理作品在线免费观看| 欧美一卡二卡三卡四卡| 日韩 欧美一区二区三区| 伊人成年综合电影网| 久久免费精品国产久精品久久久久| 麻豆精品在线观看| 噜噜噜久久亚洲精品国产品小说| 国产精品久久三| 99久久久国产精品| 欧美一区二区三区白人| 国产女人水真多18毛片18精品视频 | 久久精品一区二区三区中文字幕 | 欧美深夜福利| 欧美videos中文字幕| 国内外成人在线视频| 日本道色综合久久| 日韩电影一二三区| 色婷婷综合久久久| 视频一区视频二区中文字幕| 国产亚洲二区| 亚洲网友自拍偷拍| 亚洲影院一区| 亚洲国产精品麻豆| 亚洲高清不卡一区| 亚洲日本欧美天堂| 韩日视频一区| 国产精品视频一二三| 欧美fxxxxxx另类| 亚洲国产激情av| 国产一区清纯| 中文子幕无线码一区tr| 极品裸体白嫩激情啪啪国产精品| 国产午夜精品美女毛片视频| 成人av网站在线观看| 精品免费一区二区三区| 亚洲电影激情视频网站| 六月婷婷一区| 亚洲6080在线| 亚洲经典在线| 中文字幕日本不卡| 欧美日韩影院| 亚洲天堂久久久久久久| 亚洲人成久久| 亚洲与欧洲av电影| 亚洲综合三区| 首页欧美精品中文字幕| 色94色欧美sute亚洲线路二| 亚洲国产裸拍裸体视频在线观看乱了| 99视频精品免费观看| 亚洲男同性恋视频| 国产日韩欧美一区二区三区四区| 亚洲制服丝袜一区| 亚洲综合日本| 日韩av在线播放中文字幕| 欧美在线free| 国产精品一级在线| 精品国产乱码久久久久久蜜臀| 色综合天天视频在线观看| 国产视频一区在线播放| 欧美日韩中文| 亚洲欧美区自拍先锋| 亚洲一区黄色| 日本欧美一区二区| 欧美喷水一区二区| jizzjizzjizz欧美| 国产婷婷精品av在线| 欧美日韩另类丝袜其他| 最新国产精品久久精品| 国产日本精品| 日韩不卡一二三区| 欧美日本一区二区三区四区 | 欧美日本韩国在线| 亚洲综合色网站| 欧美日韩视频第一区| 粉嫩一区二区三区在线看| 精品91自产拍在线观看一区| 精品福利电影| 日韩高清中文字幕一区| 在线播放亚洲一区| 成人av网站在线| 国产精品另类一区| 亚洲综合二区| 一区二区在线观看免费 | 日韩视频在线观看一区二区| 国内不卡一区二区三区| 亚洲九九爱视频| 欧美日韩久久不卡| 亚洲无毛电影| 国产凹凸在线观看一区二区| 在线免费高清一区二区三区| 蜜臀久久99精品久久久久久9 | 亚洲第一成年网| 国产拍欧美日韩视频二区| 不卡一区在线观看| 亚洲国产裸拍裸体视频在线观看乱了| 日韩午夜精品视频| 国产精品视频免费一区| 成人性生交大片免费| 亚洲国产欧美在线| 国产欧美一二三区| 欧美三级视频在线播放| 亚洲成人在线| 成人综合激情网| 天天影视涩香欲综合网| 国产午夜亚洲精品不卡| 欧美日韩高清不卡| 国产一区二区三区久久久久久久久 | 欧美午夜一区二区三区免费大片| 国产精品www.| 国产精品18久久久久久久久 | 欧美日韩高清在线| 中文精品视频一区二区在线观看| 国产成人av电影在线| 亚洲bt欧美bt精品| 中文字幕精品综合| 7777精品伊人久久久大香线蕉完整版 | 久久精品视频一区二区三区| 欧美一区二视频在线免费观看| 中文字幕一区二区三区四区不卡 | 欧美自拍丝袜亚洲| 欧美连裤袜在线视频| 国产麻豆91精品| 亚洲成av人片在线| 欧美韩国日本不卡| 91精品国产入口| 色综合久久88色综合天天免费| 国产精品国产亚洲精品看不卡15 | 日韩午夜激情av| 91久久国产最好的精华液| 亚洲精品字幕| 欧美一区二区| 国产91丝袜在线18| 老司机精品视频在线| 一区二区三区 在线观看视频| 国产欧美日韩激情| 日韩欧美中文字幕一区| 巨乳诱惑日韩免费av| 亚洲高清资源| 91麻豆福利精品推荐| 国产精品资源在线| 日本成人在线视频网站| 最新国产精品久久精品| 国产亚洲婷婷免费| 精品欧美乱码久久久久久1区2区| 欧美日韩在线不卡| 91国产丝袜在线播放| 亚洲一区免费看| 亚洲精品日韩久久| 亚洲夫妻自拍| 好吊日精品视频| 午夜欧美精品久久久久久久| 国产老女人精品毛片久久| 国产午夜亚洲精品羞羞网站| 欧美mv和日韩mv的网站| 精品人在线二区三区| 制服丝袜一区二区三区| 在线一区二区视频| 在线视频一区二区三区| 美女精品在线观看| 国产精品永久入口久久久| 亚洲欧洲日本mm| 伊人成人网在线看| 影音先锋一区| 亚洲高清在线播放| 亚洲激情在线| 亚洲激情欧美| 一区福利视频| 国内揄拍国内精品久久| 欧美黄色精品| 国语精品中文字幕| 激情久久综合| 在线欧美不卡| 国产精品一区二区三区观看| 国产精品呻吟| 国产区欧美区日韩区| 国产视频在线观看一区| 亚洲国产日韩欧美一区二区三区| 精品成人免费| 最新亚洲一区| 国产精品免费区二区三区观看| 99热免费精品| 中文日韩欧美| 羞羞答答国产精品www一本| 色偷偷久久一区二区三区| 日本道色综合久久| 欧美性xxxxxx少妇| 欧美日韩一区久久| 91精品国产91久久久久久一区二区| 欧美一区2区视频在线观看| 日韩免费性生活视频播放| 精品成人私密视频| 欧美激情一区二区三区不卡 |