gpt4 book ai didi

java - 具有多个服务器实例的 AppEngine JDO 丢失通过 key 获取的实体的事务更新

转载 作者:太空宇宙 更新时间:2023-11-04 07:01:48 26 4
gpt4 key购买 nike

我有一个简单的 JDO 测试用例,可以一致地重现该问题:1. 两个 App Engine 任务几乎同时修改同一个实体2.任务使用JDO事务并使用getObjectById加载实体3. 让任务 A 修改实体上的属性 A(假设 A 首先运行)4.让任务B修改实体的属性B

当两个任务分别在两个不同的应用程序引擎实例上执行时,就会出现问题。在这种情况下,我可以看到日志消息,显示任务 A 已正确将属性 A 设置为非空值并且事务已成功提交。然后,当任务 B 在单独的实例上运行时,它会打印出它没有看到任务 A 对属性 A 所做的更改。然后任务 B 记录它已将属性 B 设置为非空值并且其事务成功完成。

然后,当我查看数据存储时,属性 A 仍然为空,尽管我可以看到日志输出表明它已设置为非空并且事务成功。我预计会发生以下两件事之一:1)当任务 B 加载实体时,属性 A 的值反射(reflect)它已被设置为非空值,或者 2)任务 B 加载过时的数据,但提交失败并出现“过多争用”错误。任何一个都可以。 (请注意,有时我确实会看到争用错误)

我错过了什么?似乎每个实例上都有一些奇怪的缓存。我非常确定在事务中通过键加载实体应该反射(reflect)对该实体所做的更改,即使这些更改是在单独的应用程序引擎实例上进行的。当编写一个测试用例来重现这一点时,我创建了全新的实体类和任务,以确保没有其他代码以某种方式搞砸事情,并且我在生产中重现了它(开发服务器给出了略有不同的行为)。

非常感谢任何帮助!

最佳答案

您似乎遇到了版本问题。使用@version,这将自动处理并发修改,并会抛出乐观锁异常。

关于java - 具有多个服务器实例的 AppEngine JDO 丢失通过 key 获取的实体的事务更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22005349/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com