Play Framework - JPA嵌套事务无效

时间:2017-11-20 04:23:24

标签: hibernate jpa playframework transactions playframework-2.0

我正在使用Play Framework 2.5.1和javaJPA,似乎嵌套的事务没有按照规定运行。

public TransactionEntity saveTransaction(TrasactionForm form) {
    return japApi.withTransaction(() -> { //outer transaction
        TransactionEntity t = jpaApi.withTransaction(() -> { //inner transaction
            TransactionEntity entity = form.toEntity();
            return txnDao.saveTransaction(entity);
        });
    return txnDao.getTransaction(entity.id); //should get the transaction from db, but throws exception saying no entity found
    });
}

真实案例比上述例子复杂一点。我有一个外部事务并在嵌套事务中保存一个实体并尝试在外部事务中获取正好保存事务 - 而不是获取它,hibernate抛出实体没有找到异常。外部事务无法看到内部事务写入数据库。

如果我调试Play JPA和hibernate代码,一切正常 - 是因为延迟?我不认为这应该发生,因为它是基本的交易原则。

我阅读并查看Play现在支持嵌套事务的代码,但是在我的简单案例中,它无效。

我感谢任何帮助和提示。

1 个答案:

答案 0 :(得分:1)

看起来您正在创建两个交易,但他们并不是"嵌套交易"在父母和子女交易的意义上。 JPA doesn't support nested transactions

这两个事务同时运行(就像你在两个独立的线程中创建它们一样)但是是单独的事务。一个事务是否会看到另一个事务的提交值取决于database transaction isolation level以及可能的任何JPA缓存。例如。如果您已经使用JPA在一个事务中读取了一个值,那么即使在另一个事务中提交它也可能会被缓存。

如果你想读取一个已提交的值,那么可能会从" inner"交易代码到"外部"事务作为正常的Scala值。或者,您可以运行第三个事务来读取值。