我在使交易在我的Play应用程序中正常工作时遇到了一些麻烦,并且我的代码的结构使我无法花时间在Play框架文档中显示“适当”地完成交易。
仅使用@Transactional是不够的,因为由于某些原因,当我抛出自己的异常时它不会回滚。
这就是我设法使交易成功的方式:
@Transactional
public Result myAction() {
try {
return ok(Json.toJson(myServiceClass.doStuff()));
} catch (BusinessRuleException e) {
return badRequest(Json.toJson("error"));
}
}
...
public class MyServiceClass {
public Bill doStuff() throws BusinessRuleException {
return jpaApi.withTransaction(() -> {
//...do a bunch of stuff here
});
}
}
这样可以吗?以后由于某种原因会引起问题吗?
答案 0 :(得分:0)
@Transactional
和JPAApi.withTransaction
创建了新的实体管理器实例。该实体经理充当工作单元。在这种情况下,您将遇到两个未连接的正在运行的事务。因此,我认为最好不要混合使用这两种方法并选择其中一种。