2017-08-09 22 views
1

我們有一個用例,我們保留一個單調遞增的密鑰來表示當前版本的客戶數據。如果在讀取數據及其處理之間存在延遲並且它們獲得多個版本,則系統將使用它來計算出最新版本並解決第三方調用者的衝突。自我管理的單調遞增密鑰OR系統的時間戳

CUSTOMER_RESOURCE_ID CURRENT_VERSION 
132323     1234 

如果有什麼這個資源的變化,我們增加1234至1235年的版本(這是完全正常,即使我們把它提高到1300,只要它不下去)。爲此,我們需要先讀取值並更新它。

其他替代方法是使用數據庫的時間戳並使用數據庫時間戳保持更新版本,該時間戳將始終增加。由於這只是一個系統,因此只有在更改數據庫時纔會發生時鐘偏差。另外,我們並沒有對多線程在一小部分時間內(即時間戳的最小粒度)更新數據的情況沒有特別關心,因爲我們有另一個鎖,因爲一次只有一個線程更新資源。

我想知道我們是否可以使用數據庫的系統時間戳來避免剛更新時的選擇和增量。

這種方法有什麼問題嗎?我認爲它會減少數據庫的開銷,但我不知道我們在這裏節省了多少。

+2

你能否用一個例子解釋一下嗎? –

+1

根據系統時鐘的粒度,您可能無法保證多個線程之間的唯一性。 –

+0

謝謝,請參閱更新。 – instanceOfObject

回答

0

可以討論許多方法。我的想法是;

- 您可以使用增量序列,即使默認列值而不是數據庫時間戳。也許毫秒可能會給你帶來問題。另外,如果你的表格不是很大,並且你的資源足夠,你可以添加一個is_last_version列,它將隨每個插入一起更新,以查詢性能中最後一個版本的客戶(即:select * from customers where customer_id = 123 and is_last_version= 1 - 擺脫訂購成本)。所以,你可以知道哪一行是最後一個版本。但是每個插入時間會更長。你應該測試它。

例子:

CUSTOMER_RESOURCE:

CUSTOMER_RESOURCE_ID CURRENT_VERSION_ID   IS_LAST_VERSION   INSERT_TIME 
         (default seq)        (default sysdate --optionally) 
132323      1       1    
132324      2       1 
132325      3       1      
132326      4       0 
132327      5       0 
132328      6       1 
132326      7       0 
132329      8       1 
132326      9       1 
132327      10       1 

當插入:

update CUSTOMER_RESOURCE 
SET IS_LAST_VERSION = 0 
where CUSTOMER_RESOURCE_ID = 132326; 

insert into CUSTOMER_RESOURCE(CUSTOMER_RESOURCE_ID,IS_LAST_VERSION) VALUES (132326,1); 
COMMIT; 

當客戶選擇最後版本:

select * from customers where customer_id = 123 and is_last_version= 1;