Google App Engine:如何在第二次交易前“关闭”某个对象?

时间:2010-07-19 14:38:33

标签: java google-app-engine jdo

这是我的一个方法的psudo代码:

1. Get PersistenceManager (pm)


2. pm.fetchObject1

3. pm.beginTransaction

4. pm.modifyObject1

5. pm.commit


6. pm.fetchObject2

7. pm.beginTransaction

8. pm.modifyObject2

9. pm.commit

然而我得到这个错误“不能在一个多个实体组上运行 单笔交易......“

我是否必须在步骤5和7之间添加另一行说我是 用object1“完成”,喜欢关闭它吗?

谢谢

2 个答案:

答案 0 :(得分:1)

虽然你说的应该有效,但它可能是一个bug。同时,您可以执行以下操作(伪代码)或将实体object1和object2放在同一实体组中。有关交易和实体组的更多信息here

  1. Get PersistenceManager (pm)

  2. pm.currentTransaction (tx)

  3. tx.begin

  4. pm.fetchObject1

  5. modifyObject1

  6. tx.commit

  7. pm.close


  8. Get PersistenceManager (pm)

  9. pm.currentTransaction (tx)

  10. tx.begin

  11. pm.fetchObject2

  12. modifyObject2

  13. tx.commit

  14. pm.close

还有更多讨论here

答案 1 :(得分:0)

现在不能记住你的主要问题的解决方案,但我确实在这里看到了另一个潜在的问题 - 你正在获取你的对象,然后开始一个交易。这是潜在的问题:

2.  fetch BankAccount (let's say it has balance of $100)
2.5 Some other process modifies' the BankAccount to have a balance of $200
3.  begin transaction
4.  deposit $20 into BankAccount
5.  commit new balance ($120) into BankAccount

糟糕!你刚刚消灭了一大笔钱。什么应该是220的余额现在是120的余额。