Google App Engine: как «закрыть» объект перед второй транзакцией? - PullRequest
0 голосов
/ 19 июля 2010

Вот псевдокод для одного из моих методов:

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 ]

1 голос
/ 19 июля 2010

Хотя то, что вы говорите, должно работать, это может быть ошибка в приложении.Тем временем вы можете сделать следующее (псевдокод) или иметь оба объекта object1 и object2 в одной и той же группе объектов.Подробнее о транзакциях и группах лиц здесь

  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

Здесь обсуждается здесь

0 голосов
/ 19 июля 2010

Не могу вспомнить решение вашей основной проблемы сейчас, но я вижу еще одну потенциальную проблему здесь - вы выбираете свои объекты, а затем запускаете транзакцию. Вот потенциальная проблема с этим:

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.

...