El uso principal de los grupos de entidades es proporcionar los medios para actualizar más de una entidad en una transacción.
Si no las ha tenido que usar, cuente sus bendiciones. O ha estado diseñando sus modelos de datos de manera que no es necesario actualizar dos entidades al mismo tiempo para mantener la coherencia, o si los necesita pero ha tenido suerte :)
Imagínese que tengo un tipo de entidad de factura y un tipo de entidad LineItem. Una factura puede tener múltiples LineItems asociados a ella. La entidad My Factura tiene un campo llamado LastUpdated. Cada vez que se agrega un LineItem a mi factura, quiero almacenar la fecha actual en el campo LastUpdated.
Mi función de actualización podría tener este aspecto (pseudocódigo)
invoice.lastUpdated = now()
lineitem = new lineitem()
invoice.put()
lineitem.put()
¿Qué pasa si la opción de venta de facturas() tiene éxito y la opción de venta línea de pedido() falla? La fecha de mi factura mostrará que algo se actualizó, pero la actualización real (el nuevo LineItem) no estaría allí. La solución es poner ambas puts() dentro de una transacción.
Una solución alternativa sería utilizar una consulta para encontrar la fecha del último LineItem insertado, en lugar de almacenar estos datos en el campo lastUpdated. Pero eso implicaría obtener tanto la factura como todos los elementos de línea cada vez que quisiera saber la última vez que se agregó un elemento de línea, lo que le costará una cuota de almacenamiento de datos valiosa.
Editar para responder a los comentarios de la persona que
Ah. Creo que entiendo tu confusión. Los párrafos anteriores establecen por qué las transacciones son importantes. Pero dices que todavía no te importan los grupos de Entidades, porque no ves cómo se relacionan con las transacciones. Pero si usa db.run-in-transaction, entonces está usando grupos de entidades, ¡quizás sin darse cuenta! Cada transacción involucra a un solo grupo de entidades, y cualquier transacción determinada solo puede afectar a las entidades que pertenecen al mismo grupo. ver here
"Todas las operaciones del almacén de datos en una transacción deben operar en entidades en el mismo grupo de entidades".
¿Qué tipo de cosas estás haciendo en tus transacciones? Hay muchas buenas razones para usar transacciones con una sola Entidad, que por defecto está en su propio Grupo de Entidades.Pero a veces necesitas mantener sincronizadas 2 o más entidades, como en mi ejemplo anterior. Si la factura y las entidades de LineItem no están en el mismo grupo de entidades, entonces no podría envolver las modificaciones en una llamada db.run-in-transaction. Por lo tanto, cada vez que desee operar transaccionalmente en 2 o más entidades, primero debe asegurarse de que estén en el mismo grupo. Espero que sea más claro por qué son útiles.
He usado db.run_in_transaction (ver http://code.google.com/appengine/docs/python/datastore/functions.html) para las transacciones (o por supuesto get_or_insert para ese caso especial, vea también http : //code.google.com/appengine/docs/python/datastore/transactions.html) - ¿Cuál es la ventaja de los grupos de entidades wrt? –
¡ay! mi primer voto negativo. la ventaja de los grupos de entidades wrt para las transacciones es que las transacciones no funcionan fuera de los grupos de entidades. si ha estado usando transacciones, entonces ha estado usando grupos de entidades, aunque sea de manera implícita. cada entidad está en un grupo por defecto. las transacciones tienen un alcance limitado para afectar a un grupo de entidades a la vez. He editado mi respuesta con una explicación más larga. –
¿Por qué está esto downvoted? Es una buena respuesta. –