【问题标题】:Play Framework - JPA nested transactions are not workingPlay Framework - JPA 嵌套事务不起作用
【发布时间】:2018-05-03 06:16:23
【问题描述】:

我正在使用带有 javaJPA 的 Play Framework 2.5.1,似乎嵌套事务没有按说明工作。

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
    });
}

实际情况比上面提到的例子稍微复杂一点。我有一个外部事务并在嵌套事务中保存一个实体,并尝试在外部事务中获取刚刚保存的事务 - 而不是获取它,休眠抛出实体未找到异常。外部事务无法看到内部事务对数据库的写入。

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

我阅读并查看了 Play 现在支持嵌套事务的代码,但在我的简单案例中,它不起作用。

感谢任何帮助和提示。

【问题讨论】:

    标签: hibernate jpa playframework transactions playframework-2.0


    【解决方案1】:

    看起来您正在创建两个事务,但从父子事务的意义上说,它们不是“嵌套事务”。 JPA doesn't support nested transactions.

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

    如果你想读取一个提交的值,那么也许将它从“内部”事务代码返回到“外部”事务作为一个普通的 Scala 值。或者,您可以运行第三个事务来读取该值。

    【讨论】:

    • 感谢您的澄清。有点奇怪,即使有外部事务并且在少数情况下失败,它也在少数情况下工作 - 无法找出确切原因 - 它主要发生在测试用例中 - 我有一些解决方法可以避免每次都构建 Play 应用程序时间。可能这就是原因。
    • 根据事务隔离级别和底层数据库,我可以想象你在读取行时可能会得到不确定的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多