对请求进行客观化事务处理的最佳实践是什么

时间:2017-03-05 10:01:51

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

我有一个带有JSON REST API的GAE应用程序。对于每个实体,我有一个带有客观化代码的DAO类和一个使用DAO的服务。该服务负责与实体相关的业务逻辑。对API的一些调用应该使用跨服务的逻辑,即在多个服务中调用方法。

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

我的问题是: 如果我有一个跨服务的API调用,我需要在ofy()。transact中封装对服务的调用,以确保在发生异常时回滚? 我想在DAO课程中保留所有对象的使用,所以另一种解决方案会很棒。

谢谢, -Louise

1 个答案:

答案 0 :(得分:1)

交易是一个贯穿各领域的问题 - 基本上是一些线程本地状态。当您启动事务时,它会跟随线程,直到事务完成(无论您将调用嵌套到transact()多少次)。

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

但是,请记住,数据存储区中的事务有些限制,您不能像通常使用RDBMS那样在任何地方应用“启动事务”。