2013-10-29 53 views
0

所以,我在這裏有一個同步問題;讓我們說明情況:Postgresql與多個用戶鎖定共享表

我有一個名爲Sendings表中,由這些列:

id sending_object_id type destinatary 

的id是自動序列ID PostgreSQL給每個表。發送object_id是一個自定義標識符,類型和destinatary ...對於這個特定的問題並不重要。

這是表會是什麼樣子數據爲例:

id sending_object_id type destinatary 
    1   1    1   A7 
    2   1    1   B1 
    3   2    2   A1 
    4   2    2   A2 
    5   3    1   B8 
    6   4    1   N1 

相同的「object_id」可以被髮送到多個destinataries,你可以看到。現在,當兩個不同的用戶使用兩臺不同的計算機嘗試插入發送的新的時,我的同步問題就出現了。

用戶A引入了新的發送信息和數據庫引擎使得SelectMax(sending_object_id)以創建註冊表中新sending_object_id。

用戶B,同時,引入了一個新的發送,使得另一SelectMax(sending_object_id).

怎麼能插入新的數據時,在同一時間我避免重複sending_object_id S'

在此先感謝。

回答

1

您可能需要在創建新的sending_object_id時鎖定表格,或者如果您不確切地知道該數字是什麼,請自行創建sequence並致電nextval

+0

什麼是更好的方式來鎖定表?而且,如果我編寫一個序列,是否只能爲第一個插入調用? (sending_object_id可以爲同一系列發送重複)。在此先感謝 –

+1

我只是在批處理開始時在應用程序中調用nextval() - 忽略結果並對插入使用currval()。這樣他們都有相同的(新)價值。 –

1

我認爲這需要使用sequences。他們保證在任何情況下都是獨一無二的。

+0

與我對理查德相同的問題,序列的nextval只能在第一次插入sender_id集時被調用?在此先感謝 –

+1

是的,你可以只在需要時纔打電話給它。或者甚至只是將nextval('sequence_name')'作爲列的默認值。所以第一次插入將具有「默認」值,而其他所有人都具有相同的數字(您可以通過在插入查詢中使用'RETURNING id'子句獲得它。 – alexius