Google app engine google应用程序引擎数据存储上的嵌套事务

Google app engine google应用程序引擎数据存储上的嵌套事务,google-app-engine,transactions,google-cloud-datastore,objectify,Google App Engine,Transactions,Google Cloud Datastore,Objectify,如果我想要全部删除,则执行全部或无 如果没有任何改变。删除组是原子的吗 如果我删除外部事务,会有什么变化吗 若我只删除内部事务,那个么组将是原子的吗 Ig I是否将周期替换为批量删除并仅保留外部事务 //内部活动计划 公共作废删除(事件计划事件计划){ y的最终Objectify=Objectify.beginTransaction(); 试一试{ 最终ActivityDAO ActivityDAO=新ActivityDAO(); 对于(最终活动:eventPlan.getActivities(

如果我想要全部删除,则执行全部或无

  • 如果没有任何改变。删除组是原子的吗
  • 如果我删除外部事务,会有什么变化吗
  • 若我只删除内部事务,那个么组将是原子的吗
  • Ig I是否将周期替换为批量删除并仅保留外部事务
  • //内部活动计划 公共作废删除(事件计划事件计划){ y的最终Objectify=Objectify.beginTransaction(); 试一试{ 最终ActivityDAO ActivityDAO=新ActivityDAO(); 对于(最终活动:eventPlan.getActivities()){ activityDao.delete(活动); } of y.getTxn().commit(); }最后{ if(of y.getTxn().isActive()){ of y.getTxn().rollback(); | } } //内活动刀 公共作废删除(活动){ y的最终Objectify=Objectify.beginTransaction(); 试一试{ //在这里执行一些逻辑,删除活动并提交txn }最后{ //检查并正常回滚 } }
    如果您使用Objectify 3.1,则所有事务都是,最多可以在5个不同的实体组上操作,即如果您的活动没有公共父项(=将它们放在同一实体组中),则一个事务中最多只能删除5个

  • 不,您使用的是并行事务(一个外部事务,多个内部事务)
  • 不,外部事务没有执行任何操作,所以它什么也不做。有多个内部事务(循环),每个内部事务都在执行自己的删除操作
  • 是的,您必须在一个事务中执行所有操作才能使操作成为原子操作。如果删除内部事务,则您的路径正确。但是,实体组事务限制仍然适用:事务中接触的所有实体必须属于同一实体组,或者(因为默认情况下启用了XG)最多五个不同的实体组(请参见上文)。注意,如果您没有显式地将实体放入实体组(通过设置父级),则每个实体都将获得自己的实体组
  • 是的,批量删除比循环中删除更好(因为效率),但第3点中的所有事务规则仍然适用

  • 如果我使用纯数据存储事务,我猜这些规则大致适用——假设我没有使用objectify。因此,嵌套事务实际上重写了实体组上的一些标记,覆盖并取消了任何外部事务?因此,让内部事务(都在循环中发生)并排执行另一个put操作,即put操作(包含在循环中)根本不属于任何事务的一部分?(b/c外部事务被忽略了?)或者外部事务仍然适用吗?每次调用
    beginTransaction()
    (在objectify或其他地方,它们都是低级API的包装器)您将获得一个新事务。因此,任何内部事务都会在实体组上启动一个新事务,并使所有外部事务无操作。因此,在GAE中嵌套事务是没有意义的,除非您认为外部事务只是浪费代码(对于特定的执行场景)。对吗?:-在GAE上没有“在实体组上启动交易",没有锁定等。GAE事务模型依赖于内部版本号,例如-当事务提交时,它会检查版本是否更改并引发异常。从文档中可以看出:App Engine通过检查事务中使用的实体组的上次更新时间来使用乐观并发控制。在提交entity groups,App Engine再次检查事务中使用的实体组的上次更新时间。如果自初始检查以来已更改,App Engine将引发异常。有关实体组的说明,请参阅数据存储概述页面。请参阅 // inside event plan dao public void delete(EventPlan eventPlan) { final Objectify ofy = Objectify.beginTransaction(); try { final ActivityDAO activityDao = new ActivityDAO(); for (final Activity activity : eventPlan.getActivities()) { activityDao.delete(activity); } ofy.getTxn().commit(); } finally { if (ofy.getTxn().isActive()) { ofy.getTxn().rollback(); | } } // inside activity dao public void delete(Activity activity) { final Objectify ofy = Objectify.beginTransaction(); try { // do some logic in here, delete activity and commit txn } finally { // check and rollback as normal } }