Overview
En esta guía, aprenderás a usar el MongoDB Go Driver para realizar transacciones. Transacciones que te permiten ejecutar una serie de operaciones que no cambian ningún dato hasta que la transacción se confirme. Si alguna operación en la transacción devuelve un error, el controlador cancela la transacción y descarta todos los cambios de datos antes de que lleguen a ser visibles.
En MongoDB, las transacciones se ejecutan dentro de sesiones lógicas. Una sesión es un agrupamiento de operaciones de lectura o escritura relacionadas que usted planea ejecutar secuencialmente. Las sesiones habilitan la coherencia causal para un conjunto de operaciones o te permiten ejecutar operaciones en una ACID transaction. MongoDB garantiza que los datos involucrados en sus operaciones de transacción permanezcan coherentes, incluso si las operaciones encuentran errores inesperados.
Al usar el controlador de Go, puedes crear una nueva sesión desde una instancia Client como un tipo Session. Recomendamos reutilizar su cliente para múltiples sesiones y transacciones en lugar de crear una nueva instancia de cliente cada vez.
Advertencia
Utiliza un Session solo con el Client (o el Database o Collection asociados) que lo creaste. El uso de un Session con un Client diferente resulta en errores de operación.
Advertencia
Las implementaciones de Session no son seguras para el uso concurrente por múltiples goroutines.
Métodos
Después de iniciar una sesión utilizando el método StartSession(), puedes modificar el estado de la sesión utilizando el conjunto de métodos proporcionados por la interfaz Session. La siguiente tabla describe estos métodos:
Método | Descripción |
|---|---|
| Inicia una nueva transacción, configurada con las opciones dadas, en esta sesión. Devuelve un error si ya hay una transacción en curso para la sesión. Para aprender más sobre este método, consulte la página startTransaction() en el manual del servidor. |
| Finaliza la transacción activa de esta sesión. Devuelve un error si no hay una transacción activa para la sesión o si la transacción se ha confirmado o finalizado. Para obtener más información sobre este método, consulte la página abortTransaction() en el manual del servidor. |
| Confirma la transacción activa de esta sesión. Devuelve un error si no hay una transacción activa para la sesión o si la transacción finalizó. Para obtener más información sobre este método, consulte la página commitTransaction() en el manual del servidor.
|
| Inicia una transacción en esta sesión y ejecuta la función de retorno |
| Finaliza cualquier transacción existente y cierra la sesión. |
La interfaz Session también tiene métodos para recuperar las propiedades de la sesión y modificar las propiedades mutables de la sesión. Encuentra más información en la documentación de la API.
Nota
Operaciones paralelas no admitidas
El controlador Go no admite la ejecución de operaciones en paralelo dentro de una sola transacción.
Ejemplo
El siguiente ejemplo muestra cómo puedes crear una sesión, crear una transacción y confirmar una operación de inserción de varios documentos mediante los siguientes pasos:
Crear una sesión desde el cliente utilizando el método
StartSession().Utiliza el método
WithTransaction()para iniciar una transacción.Inserte varios documentos. El método
WithTransaction()ejecuta la inserción y confirma la transacción. Si alguna operación resulta en errores,WithTransaction()gestiona la cancelación de la transacción.Cierra la transacción y la sesión usando el método
EndSession().
wc := writeconcern.Majority() txnOptions := options.Transaction().SetWriteConcern(wc) // Starts a session on the client session, err := client.StartSession() if err != nil { panic(err) } // Defers ending the session after the transaction is committed or ended defer session.EndSession(context.TODO()) // Inserts multiple documents into a collection within a transaction, // then commits or ends the transaction result, err := session.WithTransaction(context.TODO(), func(ctx mongo.SessionContext) (interface{}, error) { result, err := coll.InsertMany(ctx, []interface{}{ bson.D{{"title", "The Bluest Eye"}, {"author", "Toni Morrison"}}, bson.D{{"title", "Sula"}, {"author", "Toni Morrison"}}, bson.D{{"title", "Song of Solomon"}, {"author", "Toni Morrison"}}, }) return result, err }, txnOptions)
Si necesitas más control sobre tus transacciones, puedes encontrar un ejemplo donde se muestra cómo crear, confirmar y finalizar transacciones manualmente en el ejemplo de código completo.
Información Adicional
Para obtener más información sobre las operaciones de inserción, consulta la página básica Insertar un documento.
Para obtener más información sobre cómo especificar write concerns en el driver de Go, consulta Nivel de confirmación de escritura (write concern).
Para un ejemplo adicional utilizando sesiones y transacciones con el controlador Go, consulta la entrada de blog para desarrollador sobre Transacciones ACID Multidocumento.
Documentación de la API
Para aprender más sobre cualquiera de los tipos o métodos discutidos en esta guía, consulta la siguiente documentación de la API: