我有一个带有JSON REST API的GAE应用程序。对于每个实体,我都有一个带有目标代码的DAO类,以及一个使用DAO的服务。该服务负责与实体相关的业务逻辑。预计对API的某些调用将在整个服务中使用逻辑,即在多个服务中调用方法。
我希望对API的每次调用都是一个事务,即要么所有数据存储区操作成功并被持久化,要么如果发生异常,则所有数据存储区操作失败并且不持久化。
我可以看到,如果我执行两个单独的ofy()。transact(...)并在两者之间引发异常,则第一个ofy.transact()的操作将保留,而第二个则不会。如果我执行ofy()。transact()之一,并且在其中执行一个数据存储操作,然后抛出异常并执行第二个数据存储操作,则这些操作都不会持久化。
据此,我假设只有在ofy()。transact()中抛出异常时才会发生回滚。
我的问题是:
如果我有一个跨服务的API调用,则需要将对服务的调用封装在ofy()。transact中,以确保在发生异常时回滚?
我想将所有对objectify的使用都保留在DAO类中,因此一种替代解决方案将是不错的选择。
谢谢,
-路易丝
最佳答案
事务是一个跨领域的问题-基本上是线程局部状态。启动事务时,它将跟随线程直到事务完成(无论您嵌套了多少次transact()
调用)。
如果您不想在代码库中引用特定于Objectify的类,则只需为transact()
创建自己的包装器。事务性工作单元是一个广泛的数据库概念。
但是,请记住,数据存储区中的事务在某种程度上受到限制,您不能像通常使用RDBMS那样仅在各处应用“启动事务”。