Транзакция JDO в Google App Engine - PullRequest
0 голосов
/ 27 октября 2009

Я читаю следующий учебник

Возьмите следующий пример кода.

import javax.jdo.Transaction;

import ClubMembers;   // not shown

// ...
        // PersistenceManager pm = ...;

        Transaction tx = pm.currentTransaction();

        try {
            tx.begin();

            ClubMembers members = pm.getObjectById(ClubMembers.class, "k12345");
            members.incrementCounterBy(1);
            pm.makePersistent(members);

            tx.commit();
        } finally {
            if (tx.isActive()) {
                tx.rollback();
            }
        }
  1. Означает ли это, что любой блок кода между tx.begin и tx.commit будет иметь доступ только к одному процессу / потоку одновременно ? Является ли tx.being и tx.commit похожим на ключевое слово syncrhonized? Но синхронизированная защита распространяется на уровень процесса, а не на уровень потока?

  2. Для incrementCounterBy, мы должны явно объявить заголовок метода как синхронизированный? Это необходимо для того, чтобы во всей веб-среде только один процесс мог получить доступ к incrementCounterBy за один раз. Но применяется ли синхронизированная защита только к уровню потока? Помогает ли синхронизированное ключевое слово? Или это просто избыточно, и мы будем зависеть исключительно от tx.begin и tx.commit?

1 Ответ

0 голосов
/ 27 октября 2009
  1. номер

  2. Да или используйте синхронизированную запись (Объект) {}.

Транзакция дает вам возможность отменить любые изменения, сделанные после tx.begin ().

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

Другие функции, обращающиеся к ClubMember с помощью клавиши «k12345», будут видеть старое значение счетчика до тех пор, пока вы не совершите коммит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...