数据存储区有时会有一个接受事务作为参数的方法。例如,有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)
?
提前谢谢!
答案 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();