2011-07-01 68 views
1

假設我有2臺與同一交易數據庫交談的服務器。如何使用事務數據庫創建關鍵部分?

我想設置它使得這兩個服務器中只有一個會執行給定的定時操作(實質上使用數據庫來強制同步)。從我聽到的情況來看,可能會發生這樣的情況:

說我的表TABLE有2列,ID和STATUS。如果我設置的代碼,例如:

update TABLE set STATUS = 'processing' where ID = 1234 and STATUS != 'processing' 

if (weHaveModifiedAtLeastOneRow) 
{ 
    // do critical section stuff here 
    // This is code that we only want one server to run, not both. 

    update TABLE set STATUS = 'free' where ID = 1234 
} 
else 
{ 
    // We failed to get the lock, so do nothing 
} 
請問

這項工作,還是我在這裏失去了一些概念?

回答

1

如果您需要關鍵部分,請使用dbms_lock.request。你可以得到一個有意義的鎖柄槽分配唯一這樣的:

DBMS_LOCK.ALLOCATE_UNIQUE (lockname => 'MYAPP_' || ID, lockhandle => handle); 
success := DBMS_LOCK.REQUEST(lockhandle => handle, timeout => 1); 
if (success = 0) then 
-- Do stuff 
DBMS_LOCK.release(handle); 
else 
-- we waited a second and didn't got the lock. 
end if; 

,如果你喜歡它,你可以申請一個哈希和模運算過ID,在已知的鎖來推算值id空間,接受延遲無關交易的(低)風險。

+0

我不是很喜歡滾動自己的鎖;然而,這可能是一個解決方案。但是,我們仍然需要確保兩個調用服務器在發出鎖時使用相同的ID,所以看起來我們只是在傳輸同步問題而不是解決它。 – APC

相關問題