2017-08-04 60 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