我正在尝试使用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
和其他地方调用,因此我无法删除其中的交易......
答案 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有一个活动事务。