【问题标题】:What is best practice for objectify transaction handling for a request为请求对象化事务处理的最佳实践是什么
【发布时间】:2017-07-25 05:16:06
【问题描述】:

我有一个带有 JSON REST API 的 GAE 应用程序。对于每个实体,我都有一个带有对象化代码的 DAO 类,以及一个使用 DAO 的服务。该服务负责与实体相关的业务逻辑。对 API 的某些调用预计会使用跨服务的逻辑,即调用多个服务中的方法。

我希望对 API 的每次调用都是一个事务,即所有数据存储操作都成功并被持久化,或者如果发生异常,所有数据存储操作都失败并且没有一个被持久化。 我可以看到,如果我执行两个单独的 ofy().transact(...) 并在两者之间抛出异常,那么第一个 ofy.transact() 的操作将被持久化,而第二个则不会。如果我执行一次 ofy().transact() 并在其中执行一次数据存储操作,然后抛出异常并执行第二次数据存储操作,则不会保留任何操作。 据此,我假设只有在 ofy().transact() 中抛出异常时才会发生回滚。

我的问题是: 如果我有一个跨服务工作的 API 调用,我需要将对服务的调用封装在 ofy().transact 中,以确保在发生异常时回滚? 我希望在 DAO 类中保留我对 objectify 的所有使用,因此另一种解决方案会很棒。

谢谢, -路易丝

【问题讨论】:

    标签: java google-app-engine transactions google-cloud-datastore objectify


    【解决方案1】:

    事务是一个横切关注点——基本上是线程本地状态。当你开始一个事务时,它会跟随线程直到事务完成(不管你嵌套调用多少次transact())。

    如果您不希望在您的代码库中引用特定于 Objectify 的类,只需为 transact() 创建自己的包装器。事务性工作单元是一个广泛的数据库概念。

    但是,请记住,数据存储中的事务在一定程度上受到限制,您不能像通常使用 RDBMS 那样在任何地方都应用“启动事务”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-22
      • 1970-01-01
      • 1970-01-01
      • 2013-10-15
      • 2020-06-05
      • 1970-01-01
      • 1970-01-01
      • 2017-04-26
      相关资源
      最近更新 更多