Una transacción es un conjunto de operaciones en una o varias entidades. Se garantiza que cada transacción es atómica, lo que significa que las transacciones nunca se aplican parcialmente. Se aplican todas las operaciones de la transacción o no se aplica ninguna.
Usar transacciones
Las transacciones caducan al cabo de 270 segundos o si permanecen inactivas durante 60 segundos.
Una operación puede fallar en los siguientes casos:
- Se han intentado realizar demasiadas modificaciones simultáneas en la misma entidad.
- La transacción supera un límite de recursos.
- La base de datos en modo Datastore detecta un error interno.
En todos estos casos, la API Datastore devuelve un error.
Las transacciones son una función opcional. No es obligatorio usar transacciones para realizar operaciones en la base de datos.
Una aplicación puede ejecutar un conjunto de instrucciones y operaciones en una sola transacción, de forma que, si alguna instrucción u operación genera una excepción, no se aplique ninguna de las operaciones de la base de datos del conjunto. La aplicación define las acciones que se deben realizar en la transacción.
En el siguiente fragmento se muestra cómo realizar una transacción. Transfiere dinero de una cuenta a otra.
C#
Para saber cómo instalar y usar la biblioteca de cliente de Cloud Datastore, consulta las bibliotecas de cliente de Cloud Datastore. Para obtener más información, consulta la documentación de referencia de la API C# de Cloud Datastore.
Para autenticarte en Cloud Datastore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Go
Para saber cómo instalar y usar la biblioteca de cliente de Cloud Datastore, consulta las bibliotecas de cliente de Cloud Datastore. Para obtener más información, consulta la documentación de referencia de la API Go de Cloud Datastore.
Para autenticarte en Cloud Datastore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Java
Para saber cómo instalar y usar la biblioteca de cliente de Cloud Datastore, consulta las bibliotecas de cliente de Cloud Datastore. Para obtener más información, consulta la documentación de referencia de la API Java de Cloud Datastore.
Para autenticarte en Cloud Datastore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Node.js
Para saber cómo instalar y usar la biblioteca de cliente de Cloud Datastore, consulta las bibliotecas de cliente de Cloud Datastore. Para obtener más información, consulta la documentación de referencia de la API Node.js de Cloud Datastore.
Para autenticarte en Cloud Datastore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
PHP
Para saber cómo instalar y usar la biblioteca de cliente de Cloud Datastore, consulta las bibliotecas de cliente de Cloud Datastore. Para obtener más información, consulta la documentación de referencia de la API PHP de Cloud Datastore.
Para autenticarte en Cloud Datastore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Python
Para saber cómo instalar y usar la biblioteca de cliente de Cloud Datastore, consulta las bibliotecas de cliente de Cloud Datastore. Para obtener más información, consulta la documentación de referencia de la API Python de Cloud Datastore.
Para autenticarte en Cloud Datastore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Ruby
Para saber cómo instalar y usar la biblioteca de cliente de Cloud Datastore, consulta las bibliotecas de cliente de Cloud Datastore. Para obtener más información, consulta la documentación de referencia de la API Ruby de Cloud Datastore.
Para autenticarte en Cloud Datastore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Ten en cuenta que, para que nuestros ejemplos sean más concisos, a veces omitimos el rollback
si la transacción falla. En el código de producción, es importante asegurarse de que cada transacción se confirma o se revierte de forma explícita.
Qué se puede hacer en una transacción
Las transacciones pueden consultar o buscar cualquier número de entidades. El tamaño máximo de una transacción es de 10 MiB. Puedes usar una transacción de lectura y escritura o una transacción de solo lectura.
Aislamiento y coherencia
Las bases de datos en modo Datastore aplican el aislamiento serializable. Los datos leídos o modificados por una transacción no se pueden modificar simultáneamente.
Las consultas y las búsquedas de una transacción ven una vista coherente del estado de la base de datos. Esta instantánea tiene la garantía de contener el efecto de todas las transacciones y escrituras que se hayan completado antes del inicio de la transacción.
Esta vista de la instantánea coherente también se aplica a las lecturas posteriores a las escrituras dentro de las transacciones. A diferencia de la mayoría de las bases de datos, las consultas y las búsquedas dentro de una transacción en modo Datastore no ven los resultados de las escrituras anteriores dentro de esa transacción. En concreto, si una entidad se modifica o se elimina en una transacción, una consulta o una búsqueda devolverá la versión original de la entidad en el momento en que se inició la transacción, o nada si la entidad no existía en ese momento.
Además de las transacciones, las consultas y las búsquedas también tienen aislamiento serializable.
Modos de simultaneidad
Firestore en el modo de Datastore admite tres modos de simultaneidad. El modo de simultaneidad es un ajuste de la base de datos que determina cómo interactúan las transacciones simultáneas. Puedes seleccionar uno de los siguientes modos de simultaneidad:
Pesimista
Las transacciones de lectura y escritura usan bloqueos de lectura y escritura para aplicar el aislamiento y la serialización. Cuando dos o más transacciones de lectura y escritura simultáneas leen o escriben los mismos datos, el bloqueo que mantiene una transacción puede retrasar las demás. Si tu transacción no requiere ninguna escritura, puedes mejorar el rendimiento y evitar conflictos con otras transacciones usando una transacción de solo lectura. Las transacciones de solo lectura no requieren ningún bloqueo.
Las bases de datos de Firestore en el modo de Datastore usan el modo de simultaneidad pesimista de forma predeterminada.
Optimista
Cuando dos o más transacciones de lectura y escritura simultáneas leen o escriben los mismos datos, solo se completa la primera transacción que confirma sus cambios. Otras transacciones que realizan escrituras fallan al confirmar.
Optimista con grupos de entidades
Usa este modo de simultaneidad solo si tu aplicación depende de la semántica transaccional de grupos de entidades de la versión antigua de Cloud Datastore. Este modo de simultaneidad impone límites adicionales a las transacciones:
- Las transacciones están limitadas a 25 grupos de entidades.
- Las escrituras en un grupo de entidades están limitadas a 1 por segundo.
- Las consultas de las transacciones deben ser consultas de ancestros.
Para eliminar las limitaciones de consultas, transacciones y escritura de
OPTIMISTIC_WITH_ENTITY_GROUPS
, cambia el modo de simultaneidad de tu proyecto a Optimista. Para asegurarte de que este cambio es compatible con tu proyecto, haz lo siguiente:Crea un proyecto de prueba en Firestore en modo Datastore.
Cambia el modo de simultaneidad del proyecto de prueba a
OPTIMISTIC
. Envía una solicitud HTTP PATCH, como se muestra a continuación.Ejecuta pruebas en el proyecto de prueba para asegurarte de que tu carga de trabajo funciona como se espera sin grupos de entidades.
Cambiar el modo de simultaneidad del proyecto principal de
OPTIMISTIC_WITH_ENTITY_GROUPS
aOPTIMISTIC
.
Ver el modo de simultaneidad
Usa el recurso REST Firestore projects.databases para ver el modo de simultaneidad de tu base de datos:
curl -X GET -H "Authorization: Bearer "$(gcloud auth print-access-token) \
"https://firestore.googleapis.com/v1/projects/PROJECT_ID/databases"
Cambiar el modo de simultaneidad
Para cambiar el modo de simultaneidad de tu base de datos, envía una solicitud PATCH
al recurso REST projects.databases de Firestore:
curl --request PATCH \
--header "Authorization: Bearer "$(gcloud auth print-access-token) \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{"concurrencyMode":"CONCURRENCY_MODE"}' \
"https://firestore.googleapis.com/v1/projects/PROJECT_ID/databases/(default)?updateMask=concurrencyMode"
donde:
- CONCURRENCY_MODE es
PESSIMISTIC
,OPTIMISTIC
oOPTIMISTIC_WITH_ENTITY_GROUPS
. - PROJECT_ID es el ID de tu Google Cloud proyecto.
Usos de las transacciones
Una de las aplicaciones de las transacciones es actualizar una entidad con un nuevo valor de propiedad relativo a su valor actual. En el ejemplo transferFunds
anterior se hace esto con dos entidades, retirando dinero de una cuenta y transfiriéndolo a otra.
La API Datastore no vuelve a intentar las transacciones automáticamente, pero puedes añadir tu propia lógica para volver a intentarlas, por ejemplo, para gestionar los conflictos cuando otra solicitud actualiza la misma entidad al mismo tiempo.
C#
Para saber cómo instalar y usar la biblioteca de cliente de Cloud Datastore, consulta las bibliotecas de cliente de Cloud Datastore. Para obtener más información, consulta la documentación de referencia de la API C# de Cloud Datastore.
Para autenticarte en Cloud Datastore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Go
Para saber cómo instalar y usar la biblioteca de cliente de Cloud Datastore, consulta las bibliotecas de cliente de Cloud Datastore. Para obtener más información, consulta la documentación de referencia de la API Go de Cloud Datastore.
Para autenticarte en Cloud Datastore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Java
Para saber cómo instalar y usar la biblioteca de cliente de Cloud Datastore, consulta las bibliotecas de cliente de Cloud Datastore. Para obtener más información, consulta la documentación de referencia de la API Java de Cloud Datastore.
Para autenticarte en Cloud Datastore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Node.js
Para saber cómo instalar y usar la biblioteca de cliente de Cloud Datastore, consulta las bibliotecas de cliente de Cloud Datastore. Para obtener más información, consulta la documentación de referencia de la API Node.js de Cloud Datastore.
Para autenticarte en Cloud Datastore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
PHP
Para saber cómo instalar y usar la biblioteca de cliente de Cloud Datastore, consulta las bibliotecas de cliente de Cloud Datastore. Para obtener más información, consulta la documentación de referencia de la API PHP de Cloud Datastore.
Para autenticarte en Cloud Datastore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Python
Para saber cómo instalar y usar la biblioteca de cliente de Cloud Datastore, consulta las bibliotecas de cliente de Cloud Datastore. Para obtener más información, consulta la documentación de referencia de la API Python de Cloud Datastore.
Para autenticarte en Cloud Datastore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Ruby
Para saber cómo instalar y usar la biblioteca de cliente de Cloud Datastore, consulta las bibliotecas de cliente de Cloud Datastore. Para obtener más información, consulta la documentación de referencia de la API Ruby de Cloud Datastore.
Para autenticarte en Cloud Datastore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Esto requiere una transacción porque otro usuario puede actualizar el valor de balance
en una entidad después de que este código obtenga el objeto, pero antes de que guarde el objeto modificado. Si no hay ninguna transacción, la solicitud del usuario usará el valor de balance
anterior a la actualización del otro usuario y la acción de guardar sobrescribirá el nuevo valor. Con una transacción, la aplicación recibe información sobre la actualización del otro usuario.
Otro uso habitual de las transacciones es obtener una entidad con una clave con nombre o crearla si aún no existe (este ejemplo se basa en el ejemplo TaskList de crear una entidad):
C#
Para saber cómo instalar y usar la biblioteca de cliente de Cloud Datastore, consulta las bibliotecas de cliente de Cloud Datastore. Para obtener más información, consulta la documentación de referencia de la API C# de Cloud Datastore.
Para autenticarte en Cloud Datastore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Go
Para saber cómo instalar y usar la biblioteca de cliente de Cloud Datastore, consulta las bibliotecas de cliente de Cloud Datastore. Para obtener más información, consulta la documentación de referencia de la API Go de Cloud Datastore.
Para autenticarte en Cloud Datastore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Java
Para saber cómo instalar y usar la biblioteca de cliente de Cloud Datastore, consulta las bibliotecas de cliente de Cloud Datastore. Para obtener más información, consulta la documentación de referencia de la API Java de Cloud Datastore.
Para autenticarte en Cloud Datastore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Node.js
Para saber cómo instalar y usar la biblioteca de cliente de Cloud Datastore, consulta las bibliotecas de cliente de Cloud Datastore. Para obtener más información, consulta la documentación de referencia de la API Node.js de Cloud Datastore.
Para autenticarte en Cloud Datastore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
PHP
Para saber cómo instalar y usar la biblioteca de cliente de Cloud Datastore, consulta las bibliotecas de cliente de Cloud Datastore. Para obtener más información, consulta la documentación de referencia de la API PHP de Cloud Datastore.
Para autenticarte en Cloud Datastore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Python
Para saber cómo instalar y usar la biblioteca de cliente de Cloud Datastore, consulta las bibliotecas de cliente de Cloud Datastore. Para obtener más información, consulta la documentación de referencia de la API Python de Cloud Datastore.
Para autenticarte en Cloud Datastore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Ruby
Para saber cómo instalar y usar la biblioteca de cliente de Cloud Datastore, consulta las bibliotecas de cliente de Cloud Datastore. Para obtener más información, consulta la documentación de referencia de la API Ruby de Cloud Datastore.
Para autenticarte en Cloud Datastore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Al igual que antes, las transacciones son necesarias en caso de que un usuario intente crear o modificar una entidad con el mismo ID de cadena que otro. Sin una transacción, si la entidad no existe y dos usuarios intentan crearla, la operación del segundo sobrescribe la del primero sin saberlo.
Cuando falla una transacción, puedes hacer que tu aplicación vuelva a intentarla hasta que se complete correctamente o dejar que tus usuarios gestionen el error propagándolo al nivel de la interfaz de usuario de tu aplicación. No es necesario crear un loop de nuevo intento para cada transacción.
Transacciones de solo lectura
Por último, puedes usar una transacción para leer una captura coherente de la base de datos. Esto puede ser útil cuando necesitas varias lecturas para renderizar una página o para exportar datos que deben ser coherentes. Puede crear transacciones de solo lectura para estos casos.
Las transacciones de solo lectura no pueden modificar entidades, pero, a cambio, no compiten con ninguna otra transacción y no es necesario volver a intentarlas. Si solo realizas lecturas en una transacción normal de lectura y escritura, esa transacción puede entrar en conflicto con transacciones que modifiquen los mismos datos.
C#
Para saber cómo instalar y usar la biblioteca de cliente de Cloud Datastore, consulta las bibliotecas de cliente de Cloud Datastore. Para obtener más información, consulta la documentación de referencia de la API C# de Cloud Datastore.
Para autenticarte en Cloud Datastore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Go
Para saber cómo instalar y usar la biblioteca de cliente de Cloud Datastore, consulta las bibliotecas de cliente de Cloud Datastore. Para obtener más información, consulta la documentación de referencia de la API Go de Cloud Datastore.
Para autenticarte en Cloud Datastore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Java
Para saber cómo instalar y usar la biblioteca de cliente de Cloud Datastore, consulta las bibliotecas de cliente de Cloud Datastore. Para obtener más información, consulta la documentación de referencia de la API Java de Cloud Datastore.
Para autenticarte en Cloud Datastore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Node.js
Para saber cómo instalar y usar la biblioteca de cliente de Cloud Datastore, consulta las bibliotecas de cliente de Cloud Datastore. Para obtener más información, consulta la documentación de referencia de la API Node.js de Cloud Datastore.
Para autenticarte en Cloud Datastore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
PHP
Para saber cómo instalar y usar la biblioteca de cliente de Cloud Datastore, consulta las bibliotecas de cliente de Cloud Datastore. Para obtener más información, consulta la documentación de referencia de la API PHP de Cloud Datastore.
Para autenticarte en Cloud Datastore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Python
Para saber cómo instalar y usar la biblioteca de cliente de Cloud Datastore, consulta las bibliotecas de cliente de Cloud Datastore. Para obtener más información, consulta la documentación de referencia de la API Python de Cloud Datastore.
Para autenticarte en Cloud Datastore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Ruby
Para saber cómo instalar y usar la biblioteca de cliente de Cloud Datastore, consulta las bibliotecas de cliente de Cloud Datastore. Para obtener más información, consulta la documentación de referencia de la API Ruby de Cloud Datastore.
Para autenticarte en Cloud Datastore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Siguientes pasos
- Consulta información sobre las consultas.