使用Play Framework 2.2.2进行Ebean事务传播

时间:2014-03-06 01:52:09

标签: transactions playframework-2.0 ebean

我正在尝试使用Ebean和Play Framework 2.2.2进行交易。 由于@Transactional注释在我的服务方法中不起作用(我认为它们没有像Ebean文档中所解释的那样得到增强),我试图手动管理事务。

我有这段代码:

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和其他地方调用,因此我无法删除其中的交易......

2 个答案:

答案 0 :(得分:0)

Ebean.beginTransaction(); method返回一个Transaction对象。

所以,如果你改变方法的内部,可能会有所帮助:

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

答案 1 :(得分: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有一个活动事务。