【问题标题】:Google App Engine: How to "close" an object before second transaction?Google App Engine:如何在第二次交易之前“关闭”一个对象?
【发布时间】:2010-07-19 14:38:32
【问题描述】:
这是我的一种方法的伪代码:
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,想关闭它吗?
谢谢
【问题讨论】:
标签:
java
google-app-engine
jdo
【解决方案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
【解决方案2】:
现在不记得主要问题的解决方案,但我确实看到了另一个潜在问题 - 您正在获取对象,然后开始交易。这是潜在的问题:
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 的余额。