Overview
En esta guía, puede aprender a utilizar el controlador MongoDB Go para realizar transacciones. Las transacciones permiten ejecutar una serie de operaciones que no modifican ningún dato hasta que se confirma la transacción. Si alguna operación de la transacción devuelve un error, el controlador la cancela y descarta todos los cambios de datos antes de que sean visibles.
En MongoDB, las transacciones se ejecutan dentro de sesiones lógicas. Una sesión es una agrupación de operaciones de lectura o escritura relacionadas que se ejecutan secuencialmente. Las sesiones permiten la consistencia causal para un grupo de operaciones o ejecutar operaciones en una transacción ACID. MongoDB garantiza que los datos involucrados en las transacciones se mantengan consistentes, incluso si se producen errores inesperados.
Al utilizar el controlador Go, puede crear una nueva sesión desde una
Client Instancia de tipo Session. Recomendamos reutilizar el cliente para múltiples sesiones y transacciones en lugar de instanciar un nuevo cliente cada vez.
Advertencia
Use un Session solo con el Client (o el Database o Collection asociado) que lo creó. Usar un Session con un Client diferente genera errores de operación.
Advertencia
Las implementaciones de Session no son seguras para el uso simultáneo por parte de 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 |
|---|---|
| Starts a new transaction, configured with the given options, on
this session. Returns an error if there is already
a transaction in progress for the session. To learn more about
this method, see the startTransaction() page in the Server manual. Parameter: TransactionOptionsReturn Type: error |
| Ends the active transaction for this session. Returns an
error if there is no active transaction for the session or the
transaction has been committed or ended. To learn more about
this method, see the abortTransaction() page in the Server manual. Parameter: ContextReturn Type: error |
| Commits the active transaction for this session. Returns an
error if there is no active transaction for the session or if the
transaction was ended. To learn more about
this method, see the commitTransaction() page in the Server manual. The CommitTransaction() method is an idempotent function, which
means that you can attempt to commit a transaction multiple times without changing data after the first successful commit.
A transaction can succeed but return an error with the
UnknownTransactionCommitResult label. If you rerun the
CommitTransaction() method after receiving this error,
your data is not changed by the repeat attempts.Parameter: ContextReturn Type: error |
| Starts a transaction on this session and runs the fn
callback.Parameters: Context, fn func(ctx SessionContext), TransactionOptionsReturn Type: interface{}, error |
| Ends any existing transactions and closes the session. Parameter: ContextReturn Type: none |
La Session interfaz también incluye métodos para recuperar propiedades de sesión y modificar propiedades de sesión mutables. Encuentre 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 paralelas 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:
Cree una sesión desde el cliente utilizando el método
StartSession().Utilice 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.Cierre la transacción y la sesión utilizando 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, consulte la Insertar una página de Fundamentos del documento.
Para obtener más información sobre cómo especificar inquietudes de escritura en el controlador Go,consulte Inquietud de escritura.
Para obtener un ejemplo adicional del uso de sesiones y transacciones con el controlador Go, consulte la publicación del blog para desarrolladores sobre transacciones ACID de múltiples documentos.
Documentación de la API
Para obtener más información sobre cualquiera de los tipos o métodos analizados en esta guía, consulte la siguiente documentación de API: