2013-10-24 71 views
0

計數器表(SQL數據庫表)SQL計數器遞增/遞減同步

CounterID  |CounterValue 
1    |5 
2    |3 

我有多個客戶端訪問/經由JDBC修改(遞增&減少)這些計數器。什麼是同步處理計數器的最佳方式。

當前客戶端首先選擇計數器值,然後遞增並更新該值。但問題是如果兩個客戶端在其他計數器值更新之前選擇了相同的值。

請指教。 謝謝。

+2

如果你的數據庫有序列(發電機),那麼你應該考慮使用這些替代。 –

+0

@MarkRotteveel在這種情況下,在AS400中使用db2。添加/刪除計數器會經常發生,我無權爲每個計數器創建一個新的序列。 –

回答

1

以下內容將確保每個呼叫獲得唯一的計數器值。 在一個自治事務運行此:

While (true) do 
    SELECT CounterValue into cv FROM CountersTable WHERE CounterID = 1; 
    UPDATE countertable SET CounterValue = cv+1 WHERE CounterID = 1 and CounterValue = cv; 
    IF (rows updated > 0) THEN 
    COMMIT; 
    EXIT LOOP; --No one else modified the CounterValue 
    END IF 
End do; 
+0

我正在使用JDBC。據我所知你建議使用交易。謝謝,我也在尋找其他的選擇。 (因爲在當前系統中實現基於事務的更新有很多工作。) –

+1

如果您使用自動提交,那麼您可以從我的答案中刪除提交。 –