Понимание, безопасна ли эта транзакция в JDO - PullRequest
0 голосов
/ 25 июля 2010

Мне нужно вынуть объект из EntityGroup и сохранить его вне группы объектов, я думаю, что самый простой способ объяснить это - показать код.В следующем коде будет ли функция removeMessage() откатывать оба обращения к диспетчеру постоянства?

Есть ли способ проверить это, то есть, как мне смоделировать второе makePersistentзапрос не выполнен?

// Not meant to compile, it is for example only
public class UndeliveredMessages {

    private Key key;
    private long count = 0;
    private Set<Message> messages = HashSet<Message>();

    public void removeMessage(Message message) {
            Transaction tx = pm.currentTransaction();
            try {
                    count--;
                    messages.remove(message);
                    pm.makePersistent(this);
                    Message item = new Message();
                    item.setFrom(message.getFrom());
                    item.setTo(message.getTo());
                    item.setText(message.getText());
                    pm.makePersistent(message); // If this one fails, will all of the above be rolled back?
                    tx.commit();
            } finally {
                    if (tx.isActive())
                            tx.rollback();
            }
    }

    public void addMessage(String from, String to, String message) {
            count++;
            messages.put(new Message(from, to, message));
            pm.makePersistent();
    }

    public Message getNextMessage() {
            if(!messages.isEmpty())
                    return messages.iterator().next();

            return null;
    }

}

Другими словами, мне нужно убедиться, что он не попадает в состояние, когда сообщение полностью исчезает.

1 Ответ

2 голосов
/ 26 июля 2010

Транзакции в App Engine работают только в пределах одной группы сущностей, то есть сущностей с одним и тем же родителем.Я полагаю, что в Java это реализуется «собственными» сущностями.

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

...