計數器表(SQL數據庫表)SQL計數器遞增/遞減同步
CounterID |CounterValue
1 |5
2 |3
我有多個客戶端訪問/經由JDBC修改(遞增&減少)這些計數器。什麼是同步處理計數器的最佳方式。
當前客戶端首先選擇計數器值,然後遞增並更新該值。但問題是如果兩個客戶端在其他計數器值更新之前選擇了相同的值。
請指教。 謝謝。
計數器表(SQL數據庫表)SQL計數器遞增/遞減同步
CounterID |CounterValue
1 |5
2 |3
我有多個客戶端訪問/經由JDBC修改(遞增&減少)這些計數器。什麼是同步處理計數器的最佳方式。
當前客戶端首先選擇計數器值,然後遞增並更新該值。但問題是如果兩個客戶端在其他計數器值更新之前選擇了相同的值。
請指教。 謝謝。
以下內容將確保每個呼叫獲得唯一的計數器值。 在一個自治事務運行此:
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;
我正在使用JDBC。據我所知你建議使用交易。謝謝,我也在尋找其他的選擇。 (因爲在當前系統中實現基於事務的更新有很多工作。) –
如果您使用自動提交,那麼您可以從我的答案中刪除提交。 –
如果你的數據庫有序列(發電機),那麼你應該考慮使用這些替代。 –
@MarkRotteveel在這種情況下,在AS400中使用db2。添加/刪除計數器會經常發生,我無權爲每個計數器創建一個新的序列。 –