2009-10-27 125 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

相關問題