2014-06-25 24 views
1

之外定義的基本事務看起來像這樣:物化 - OFY()在方法交易

import static com.googlecode.objectify.ObjectifyService.ofy; 
import com.googlecode.objectify.Work; 

// If you don't need to return a value, you can use VoidWork 
Thing th = ofy().transact(new Work<Thing>() { 
    public Thing run() { 
     Thing thing = ofy().load().key(thingKey).now(); 
     thing.modify(); 
     ofy().save().entity(thing); 
    } 
}); 

當OFY()load()和其他OFY()方法從它們具有的所有事務中調用。交易的好處,比如原子。 但是,使用包含ofy()方法的Util方法是否會轉義該事務?像下面這樣。

// If you don't need to return a value, you can use VoidWork 
Thing th = ofy().transact(new Work<Thing>() { 
    public Thing run() { 
     Util.modify(thingKey); 
    } 
}); 

其中,Util定義在某處。

public class Util { 

    public static modify(thingKey) { 
     Thing thing = ofy().load().key(thingKey).now(); 
     thing.modify(); 
     ofy().save().entity(thing); 
    } 

} 

回答

2

您描述的兩種情況完全相同。

如果你希望在事務之外運行一些事情,那麼Objectify提供了一個.transactionless()方法來「逃避」事務上下文。

+0

我想了很多,但在開始編程之前需要確定。對於我的想法,你能詳細說明這是如何工作的或鏈接文檔嗎?謝謝。 –

+1

第二種情況只是一種抽象,所以它必須工作相同 - 它更像是一個純java主題。然而,爲了幫助理解,您可以使用調試器追蹤到事務處理調用,並且您會發現一些設置和完成代碼 - 您的Work實現run()方法調用。該代碼設置了一些狀態,然後就知道這樣的事情是有效的。 –

+0

Objectify的事務上下文是一個線程本地的。 – stickfigure