2017-06-14 99 views
0

有用於存儲一些唯一標識符的表。我的第一個想法是有這樣的每一個標識符前綴增量計列:Spring/JPA - 如何安全地增加計數器

ID IDENTIFIER COUNTER 
1 B-1  1 
2 A-1  1 
3 A-2  2 
4 A-3  3 
5 B-2  2 
6 BBA-1  1 
7 BBA-2  2 

每個標識符是由字母或字母組合,前綴和一些增量數延長。例如,如果我想添加一個帶有A-前綴的新標識符,則必須選擇計數器的最大值,其中IDENTIFIER以'A-'開頭,返回值遞增1,並將其與搜索前綴連接並保存到數據庫。 有了這種方法,當兩個並行線程獲取相同的計數器值時,我害怕併發問題,唯一性規則將被違反。

我該如何預防?它是更好的辦法有兩個表,其中一個只照顧個別櫃檯的每一個標識符基礎,就像這樣:

BASE COUNTER 
A 3 
B 2 
BBA 2 

春天在什麼或JPA有一定的機制來處理這件事?我目前的首要想法是樂觀鎖定和註解。它會很有用,因爲我的項目中已經有JPA映射了嗎?

+0

你能解釋爲什麼你的標識符是[字母] - [數字]格式嗎?這有什麼意義?記錄A-1和記錄A-2之間的關係是什麼?他們有什麼共同點? – Solace

+0

「標識符」的格式對於這個問題並不重要。假設那些字母是某種類型的東西。用順序後綴和數據庫併發來生成它們是重點。 – shx

+0

我問過,因爲版本註釋對於你描述的問題來說感覺過於誇張。您可以將Id註釋用於實體中的多個列。所以我建議你將字母和數字分成兩個單獨的列,並用Id註釋標記它們。您可以使用GeneratedValue註釋來自動遞增該數字列。請注意,在Hibernate中允許使用多個Id註釋,但不符合JPA。如果您想堅持使用JPA規則,您可以查看EmbeddedId註釋。 – Solace

回答

-1

您可以在MySQL上使用CAS。

  1. 從$選擇計數器your_table其中IDENTIFIER = $ your_IDENTIFIER

這裏得到$計數

  • 更新$ your_table組COUNTER =($計數+ 1 )其中IDENTIFIER = $ your_IDENTIFIER和COUNTER = $ count
  • +0

    這不完全是解決問題的辦法 – shx