【问题标题】: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 的余额。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-13
        相关资源
        最近更新 更多