2014-02-10 56 views
0

我有一個bpel進程,它通過java調用db2存儲過程以獲取唯一序列號,然後將該數字插入到db2表之一中。此進程在羣集環境中運行,因此有時會發生進程的兩個實例獲取相同唯一序列號,然後嘗試將重複值插入表中導致出錯。謝謝。集羣環境中的bpel服務的重複問題

+0

顯然,存儲過程是應該產生獨特的順序ce號碼,不。您需要重寫該過程,或者如果不可能,可能會在Java程序中同步對它的調用,以使兩個進程無法同時調用該過程。 – mustaccio

+0

另一種選擇是使用內置的['sequence'](http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.admin.dbobj.doc/ doc/c0023175.html)鍵入DB2,這是保證不重複。 – bhamby

+0

感謝您的信息。存儲過程在DB2中使用序列類型。同樣由於集羣環境使得通過Java進行同步調用將無法解決,因爲我們有兩個服務器,代碼是這樣的,並且Java調用db2序列時將同時從兩個服務器產生重複數據。 – Sonali

回答

0

正如@mustaccio所說,如果您使用的是序列,無論同時有多少客戶端從序列中請求值,都無法獲得相同的值兩次。

也就是說,沒有什麼能夠阻止你將一行插入到一個表中,該表的序列還沒有生成;然後,當程序返回有問題的價值,並嘗試插入它,它就會失敗:

create table test (id int not null primary key); 
create sequence s1 start with 10; 

-- This will insert the value 10, which is OK. 
insert into test values (nextval for s1); 

-- This will insert the value 11, which is OK. 
insert into test values (nextval for s1); 

-- Insert a row without using sequence (BAD!) 
insert into test values (13); 

-- This will insert the value 12, which is OK. 
insert into test values (nextval for s1); 

-- This will attempt to the value 13, which will fail because it is a "duplicate", 
-- but not because the sequence generated a duplicate. 
insert into test values (nextval for s1); 

這個問題的解決方案是:

  1. 保證進程不插入值而不使用序列
  2. 如果#1不可行,請確保使用alter sequence重新啓動序列,使其不會產生衝突。 (在上面的例子中,alter sequence s1 restart with 14後執行調皮插入語句。
0

正如你所說,在BPEL是在羣集environmnent運行..

如果你正在使用BPEL輪詢,請確保您標記「分佈式查詢」標誌。

分佈式查詢是指當讀取記錄,它是由閱讀實例鎖定。這要皮卡記錄跳過鎖定的記錄的另一個實例。