数据存储有时具有接受事务作为参数的方法。例如,有datastore.get(key)
,同时还有datastore.get(transaction, key)
。 Documentation这里说后一个版本“在提供的事务中执行”。
但是如果我用这样的交易,好像就不需要传入交易了。
Transaction tx = datastore.beginTransaction();
Entity tom = datastore.get(key); //no need to pass in a transaction
tom.setProperty("age", 40);
datastore.put(tom);
tx.commit();
我应该如何以及何时使用datastore.get(transaction, key)
?
提前致谢!
最佳答案
好吧,事实证明答案就在我读过的同一个文档中......
Here解释了 get(key)
及其重载 get(transaction, key)
之间的区别。
DatastoreService 提供对无模式数据存储系统的同步访问。该系统中数据的基本单位是实体,它具有不可变的身份(由 key 表示)和零个或多个可变属性。实体对象可以通过标识符创建、更新、删除、检索,并通过属性组合进行查询。 DatastoreService 可以以事务方式使用并支持“当前”事务的概念。当前事务是通过调用 beginTransaction() 建立的。当尝试提交或回滚或再次调用 beginTransaction() 时,此方法返回的事务将不再是当前事务。事务只能在创建它的线程中处于当前状态。
put、get、delete 的各种重载均支持事务。此类的用户可以选择将事务(可能为空)显式传递给这些方法或依赖于 ImplicitTransactionManagementPolicy 控制的行为。如果用户显式提供事务,则由用户在适当的时间调用 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(如果事务尚未运行)。
关于java - Google App Engine 数据存储区 api 接受事务作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21085884/