2009-10-27 96 views
0

我正在阅读以下tutorialGoogle App Engine中的JDO交易

请看下面的代码示例。

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,我们是否明确声明了方法头是否同步?这是为了确保在整个Web环境中,一次只能有一个进程访问incrementCounterBy。但是,同步保护只适用于线程级别吗?同步关键字有帮助吗?或者它只是多余的,我们将完全依赖于tx.begin和tx.commit?

回答

0
  1. 是或使用同步的(对象){}表示法。

该事务只给您回滚自tx.begin()以来所做的任何更改的可能性。

您还必须考虑到,俱乐部成员也可以在您进行交易时从同步区块之外访问。

使用“k12345”键访问ClubMember的其他功能将会看到旧的计数器值,直到您提交。

+0

但是使用synchronized(Object){},只会给你线程级别的同步保护,而不是进程级别。不同的网络请求通常在不同的进程中重新进行 – 2009-10-27 17:01:59

+0

很明显,对象将是“this”或其他使用完全锁定对象。 (不是新对象()) – Fedearne 2009-10-28 08:16:12

相关问题