2010-01-04 24 views
5

Sé que la forma de manejar la transaccionalidad de DB en el motor de la aplicación es dar a las diferentes entidades el mismo Parent (Grupo de entidades) y usar db.run_in_transaction.En el motor de la aplicación de Google, ¿cómo implemento las transacciones de la base de datos?

Sin embargo, supongamos que soy no capaz de dar dos entidades del mismo padre. ¿Cómo me aseguro de que las actualizaciones de mi DB ocurran en una transacción?

¿Existe una solución técnica? Si no, ¿hay algún patrón que pueda aplicar?

Nota: Estoy usando Python.

Respuesta

5

Siempre que las entidades pertenezcan al mismo grupo, esto no es un problema. Desde el docs:

Todas las operaciones del almacén de datos en una transacción deben operar en entidades en el mismo grupo de entidades. Este incluye consultar entidades por el antecesor , recuperar entidades por clave, actualizar entidades y eliminar entidades . Observe que cada entidad raíz pertenece a un grupo de entidades separado, por lo que una sola transacción no puede crear o opera en más de una entidad raíz. Para obtener una explicación de los grupos de entidades, ver Claves y Grupos de entidades.

También hay un buen artículo sobre Transaction Isolation in App Engine.

EDIT: Si necesita actualizar entidades con padres diferentes en la misma transacción, deberá implementar una forma de serializar los cambios que realizó usted mismo y deshacer manualmente si se produce una excepción.

+0

Pero si se siguen las "Teclas y Entidad Grupos" enlace a http://code.google.com/appengine/docs/ python/datastore/keysandentitygroups.html # Entity_Groups_Ancestors_and_Paths, el único método enumerado para poner dos entidades en el mismo grupo de entidades es asegurarse de que comparten un ancestro –

+0

Lo sentimos, supongamos que técnicamente me refiero a los grupos, no a los padres. Pero sí, de acuerdo con el libro que estoy leyendo, parece que la única forma de asignar grupos en python es a través de un ancestro/padre común. – willem

+0

@James @Willem Ambos tienen razón. Las entidades se consideran un grupo solo si comparten el mismo nodo raíz/padre. He editado mi respuesta. – jbochi

2

Las transacciones en el almacén de datos de AppEngine actúan de forma diferente a las transacciones a las que podría estar acostumbrado en una base de datos SQL. Por un lado, la transacción no bloquea realmente las entidades en las que opera.

El artículo Translation Isolation in App Engine explica esto con más detalle.

Debido a esto, tendrá que pensar de manera diferente sobre las transacciones; probablemente encontrará que en la mayoría de los casos en los que desea usar una transacción es innecesario o no lograría lo que querer.

Para obtener más información acerca de los grupos de entidades y el modelo del almacén de datos, consulte How Entities and Indexes are Stored.

Handling Datastore Errors habla sobre cosas que podrían causar una transacción no comprometida y cómo manejar los problemas.

2

Una posibilidad es implementar su propio manejo de transacciones como lo ha mencionado. Si está pensando en hacer esto, valdría la pena su tiempo para explorar el trabajo anterior sobre este problema.

http://danielwilkerson.com/dist-trans-gae.html

Dan Wilkerson también dio una charla sobre el mismo en Google IO. Deberías poder encontrar un video de la charla.

+0

Muy útil, gracias Kris. – willem

3

Si desea realizar transacciones entre grupos de entidades, tendrá que implementarlas usted mismo o esperar a que una biblioteca las haga. Hace un tiempo, escribí an article sobre cómo implementar transacciones entre entidades cruzadas en el caso de 'transferencia bancaria'; puede aplicarse a su caso de uso también.

+0

+1 muy buen artículo! ¡gracias! – jbochi

Cuestiones relacionadas