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 Google应用程序引擎数据存储api接受事务作为参数_Java_Google App Engine - Fatal编程技术网

Java Google应用程序引擎数据存储api接受事务作为参数

Java Google应用程序引擎数据存储api接受事务作为参数,java,google-app-engine,Java,Google App Engine,数据存储区有时具有将事务作为参数接受的方法。例如,有datastore.get(key),同时还有datastore.get(transaction,key)。此处表示后一个版本“在提供的事务中执行” 但是如果我使用这样的事务,似乎没有必要传入该事务 事务tx=数据存储。beginTransaction() 实体tom=datastore.get(key)//不需要传入事务 tom.setProperty(“年龄”),40岁 datastore.put(tom) tx.commit() 我应该如

数据存储区有时具有将事务作为参数接受的方法。例如,有
datastore.get(key)
,同时还有
datastore.get(transaction,key)
。此处表示后一个版本“在提供的事务中执行”

但是如果我使用这样的事务,似乎没有必要传入该事务

事务tx=数据存储。beginTransaction()

实体tom=datastore.get(key)//不需要传入事务

tom.setProperty(“年龄”),40岁

datastore.put(tom)

tx.commit()

我应该如何以及何时使用
datastore.get(事务,键)

提前谢谢

好吧,结果证明答案就在我读过的同一份文档中

解释
get(key)
及其重载
get(transaction,key)
之间的区别

DatastoreService提供对无模式数据存储系统的同步访问。在这个系统中,数据的基本单位是实体,它有一个不可变的标识(由一个键表示)和零个更可变的属性。可以通过标识符创建、更新、删除、检索实体对象,并通过属性组合进行查询。 DatastoreService可以事务性地使用,并支持“当前”事务的概念。通过调用beginTransaction()建立当前事务。当尝试提交或回滚或再次调用beginTransaction()时,此方法返回的事务将不再是当前事务。事务只能在创建它的线程中是当前的

put、get和delete的各种重载都支持事务。此类的用户可以选择显式地将(可能为null)事务传递给这些方法,也可以选择依赖隐式TransactionManagementPolicy所控制的行为。如果用户显式提供事务,则由用户在适当的时间调用Transaction.commit()或Transaction.rollback()。如果用户依赖隐式事务管理,并且安装的策略创建了一个事务,则在操作返回给用户之前,该事务将被提交(如果成功)或回滚(如果失败)。根据ImplicitTransactionManagementPolicy管理事务的方法有:delete(Key…)、delete(Iterable)、get(Key)、get(Iterable)、put(Entity)和put(Iterable)


采用事务参数的prepare重载的行为与采用事务参数的put、get和delete重载的行为相同。但是,prepare的重载不接受事务参数,这与put、get和delete不同,如果一个事务已在运行,则不使用现有事务;如果一个事务尚未运行,则不咨询隐式TransactionManagementPolicy。

只要您仅从一个线程使用引用的数据存储,并且在该线程中一次只有一个活动事务,您的示例就可以正常工作

当您希望一次有多个活动事务时,可以使用带有显式事务对象的“get(txn,key)”表单。例如,以下代码并行更改两个实体,而不会在跨组事务中纠缠它们:

Transaction tx1 = datastore.beginTransaction();
Transaction tx2 = datastore.beginTransaction();

Entity tom = datastore.get(tx1, key1);
Entity bob = datastore.get(tx2, key2);

tom.setProperty("age", 40);
bob.setProperty("age", 45);

datastore.put(tx1, tom);
datastore.put(tx2, tom);

tx1.commit();
tx2.commit();