Google App Engine数据存储区api接受一个事务作为参数

时间:2014-01-13 07:23:04

标签: java google-app-engine

数据存储区有时会有一个接受事务作为参数的方法。例如,有datastore.get(key),同时有datastore.get(transaction, key)。这里的Documentation表示后一个版本'在提供的事务'中执行。

但如果我使用这样的交易,似乎没有必要传递交易。

  

交易tx = datastore.beginTransaction();

     

实体tom = datastore.get(key); //无需传递交易

     

tom.setProperty(“age”,40);

     

datastore.put(TOM);

     

tx.commit();

我应该如何以及何时使用datastore.get(transaction, key)? 提前谢谢!

2 个答案:

答案 0 :(得分:1)

好的,事实证明答案在于我读到的相同文档...

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

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

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

采用Transaction参数的prepare的重载与采用Transaction参数的put,get和delete的重载相同。但是,与put,get和delete不同,不带Transaction参数的prepare的重载如果已经运行,则不使用现有的Transaction,如果尚未运行,则不会查询ImplicitTransactionManagementPolicy。

答案 1 :(得分:1)

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

当您希望一次拥有多个活动事务时,可以将“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();