2017-08-04 31 views
0

我的問題是: 我想在GAE數據存儲中保留一個實體,如果它尚未保留。java在GAE環境中與多個JVM實例同步

我的代碼的算法是:

select * from Employee where code=1234; 
if record not found then: 
    persist it; 
otherwise 
    do nothing; 

這是很容易做到的,但它是在多線程環境是複雜的。當兩個線程同時嘗試執行上述查詢時,會發生此問題。都得到null所以這兩個線程都是持久實體。因此,而不是隻有一個,兩個記錄正在創建數據庫 在這裏我已經同步完整的方法,但由於GAE env中的多個jvm實例,它不起作用。

請建議我適當的解決方案。 我正在使用的我的技術堆棧:
Java,Spring,REST,GAE數據存儲。

+0

您使用[tag:google-cloud-datastore]還是[tag:google-cloud-sql]是因爲您顯示了psuedo SQL並且[tag:google-cloud-datastore]不支持該功能。目前還不清楚你在問什麼,因爲你用無關標籤發送了垃圾郵件。請澄清。 –

+0

我正在使用google-cloud-datastore,Psuedo Sql只是爲了解釋我的需求。 –

回答

0

我相信你可以用兩種不同的如下解決此:

  • 僱員類 - 存儲您的正常數據爲員工實體

    • 鑰匙(自動分配的數字)
    • 員工編號
    • 姓名等
  • EmployeeNumberConstraint類 - 這是嚴格的員工的數量執行獨特

    • 鍵(與從僱員實體員工數量)

用於插入新員工 -

  • 開始交易
  • 插入enti類型爲EmployeeNumberConstraint,鍵值爲員工編號(2.g. 1234)
  • 插入類Employee的實體(自動生成的密鑰和員工數量= 1234)
  • 提交事務

如果您嘗試與現有的員工數量,插入插入僱員實體EmployeeNumberConstraint因ALREADY_EXISTS異常失敗。回滾事務以查找任何異常。基本上,數據存儲使用兩種類型和事務來保證唯一性。所以,你不需要在應用程序中進行任何同步。

刪除一名員工 - 確保在同一交易中刪除兩個實體 - 一個來自Employee種類和相應的EmployeeNumberConstraint

相關問題