Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对请求进行对象化事务处理的最佳实践是什么_Java_Google App Engine_Transactions_Google Cloud Datastore_Objectify - Fatal编程技术网

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

Java 对请求进行对象化事务处理的最佳实践是什么,java,google-app-engine,transactions,google-cloud-datastore,objectify,Java,Google App Engine,Transactions,Google Cloud Datastore,Objectify,我有一个带有JSON REST API的GAE应用程序。对于每个实体,我都有一个带有objectify代码的DAO类和一个使用DAO的服务。服务负责与实体相关的业务逻辑。对API的某些调用预计将在服务之间使用逻辑,即在多个服务中调用方法 我希望对API的每个调用都是一个事务,即,要么所有数据存储操作成功并被持久化,要么如果发生异常,则所有数据存储操作都会失败且没有一个被持久化。 我可以看到,如果我分别执行两个of y().transact(…)并在它们之间抛出一个异常,那么第一个of y.tra

我有一个带有JSON REST API的GAE应用程序。对于每个实体,我都有一个带有objectify代码的DAO类和一个使用DAO的服务。服务负责与实体相关的业务逻辑。对API的某些调用预计将在服务之间使用逻辑,即在多个服务中调用方法

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

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

谢谢,
-Louise

事务是一个跨领域的问题——基本上是一个线程本地状态。启动事务时,它会跟随线程直到事务完成(无论您嵌套调用了多少次
transact()

如果不希望对象化跨代码库引用的特定类,只需为
transact()
制作自己的包装器即可。事务性工作单元是一个广泛的数据库概念

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