2014-03-06 51 views
0

我試圖使用Ebean和Play Framework 2.2.2的交易。 由於@Transactional註釋在我的服務的方法中不起作用(我想他們沒有像Ebean文檔中的解釋那樣得到增強),我試圖手動管理事務。Ebean與Play Framework的交易傳播2.2.2

我有這樣的代碼:

public void method1() { 
    Ebean.beginTransaction(); 
    try { 
     // Do something 
     // Do something else 
     method2(); 
     Ebean.commitTransaction(); 
    } 
    finally { 
     Ebean.endTransaction(); 
    } 
} 

public void method2() { 
    Ebean.beginTransaction(); 
    try { 
     doSomething(); 
     Ebean.commitTransaction(); 
    } 
    finally { 
     Ebean.endTransaction(); 
    } 
} 

有了這個代碼,我有以下錯誤,當我在method2開始交易:

javax.persistence.PersistenceException: The existing transaction is still active?

如何定義事務的傳播當手動聲明它們時,就像我對@Transactional所做的一樣? 我的method2可以在method1和其他地方調用,所以我不能刪除它中的交易...

回答

0

Ebean.beginTransaction();方法返回一個Transaction對象。

所以,如果你改變你的方法,如可以幫助裏面:

Transaction t = Ebean.beginTransaction(); 
try { 
    doSomething(); 
    t.commit(); 
} 
finally { 
    t.end(); 
} 
+0

這不會改變任何東西,因爲Ebean一次管理一個事務(請參閱Ebean.currentTransaction())。所以即使我使用了一個變量,交易也會被註冊。我試圖找出是否可以使用REQUIRED,REQUIRES_NEW,MANDATORY ... – c4k

0

嘗試在方法開始另一個事務2

更換

@Transactional 
public void method2() {..} 

@Transactional(type = TxType.REQUIRES_NEW) 
public void method2() {..} 

TxScope txScope = TxScope.requiresNew(); 

public void method2() { 
     Ebean.execute(txScope, new TxRunnable() { 
     public void run() { 
     .. 
     } 
} 

你可能在這裏找到這些建議: http://www.avaje.org/doc/ebean-userguide.pdf

,這是正確的, Ebean具有每線程EbeanServer一個活動的事務。