Play Framework - JPA 嵌套事务不起作用
Play Framework - JPA nested transactions are not working
我正在将 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 throwing entity not found 异常。外部事务无法看到内部事务对数据库的写入。
如果我调试 Play JPA 和休眠代码,一切正常 - 是因为延迟吗?我认为这不应该发生,因为这是基本的交易原则。
我阅读并查看了 Play 现在支持嵌套事务的代码,但对于我的简单案例,它不起作用。
感谢任何帮助和提示。
看起来您正在创建两个交易,但它们不是 "nested transactions" 父子交易。 JPA doesn't support nested transactions.
这两个事务 运行 并发(就像您在两个单独的线程中创建它们一样)但是是单独的事务。一个事务是否会看到另一个事务的提交值取决于 database transaction isolation level 和可能的任何 JPA 缓存。例如。如果您已经使用 JPA 在一个事务中读取了一个值,那么即使在另一个事务中提交它也可能被缓存。
如果你想读取一个提交的值,那么也许 return 它从 "inner" 事务代码到 "outer" 事务作为一个普通的 Scala 值。或者,您可以 运行 第三个事务来读取值。
我正在将 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 throwing entity not found 异常。外部事务无法看到内部事务对数据库的写入。
如果我调试 Play JPA 和休眠代码,一切正常 - 是因为延迟吗?我认为这不应该发生,因为这是基本的交易原则。
我阅读并查看了 Play 现在支持嵌套事务的代码,但对于我的简单案例,它不起作用。
感谢任何帮助和提示。
看起来您正在创建两个交易,但它们不是 "nested transactions" 父子交易。 JPA doesn't support nested transactions.
这两个事务 运行 并发(就像您在两个单独的线程中创建它们一样)但是是单独的事务。一个事务是否会看到另一个事务的提交值取决于 database transaction isolation level 和可能的任何 JPA 缓存。例如。如果您已经使用 JPA 在一个事务中读取了一个值,那么即使在另一个事务中提交它也可能被缓存。
如果你想读取一个提交的值,那么也许 return 它从 "inner" 事务代码到 "outer" 事务作为一个普通的 Scala 值。或者,您可以 运行 第三个事务来读取值。