Docs Menu
Docs Home
/ /

Transacciones

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.

Después de iniciar una sesión con el método StartSession() en su cliente, puede modificar el estado de la sesión mediante el conjunto de métodos proporcionado por el Session ​​devuelto. La siguiente tabla describe estos métodos:

Método
Descripción

StartTransaction()

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: TransactionOptions
Return Type: error

AbortTransaction()

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: Context
Return Type: error

CommitTransaction()

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: Context
Return Type: error

WithTransaction()

Starts a transaction on this session and runs the fn callback.

Parameters: Context, fn func(ctx SessionContext), TransactionOptions
Return Type: any, error

EndSession()

Ends any existing transactions and closes the session.

Parameter: Context
Return Type: none

Un Session también tiene métodos para recuperar propiedades de sesión y modificar propiedades de sesión mutables. Consulte la documentación de la API para obtener más información sobre estos métodos.

Puede configurar opciones a nivel de sesión y de transacción para personalizar cómo el controlador realiza una transacción. Los siguientes pasos describen cómo configurar opciones para todas las transacciones ejecutadas dentro de un Session determinado:

  1. Cree una instancia TransactionOptions. Puede especificar opciones como una preocupación de escritura, preocupación de lectura y preferencia de lectura para todas las transacciones ejecutadas en una sesión determinada.

  2. Crea una instancia SessionOptions llamando al método SetDefaultTransactionOptions() y pasando la instancia TransactionOptions como parámetro.

    También puede especificar otras opciones de sesión, como la consistencia causal, en su instancia SessionOptions.

  3. Pase la instancia SessionOptions al método client.StartSession().

El siguiente código especifica las opciones de sesión y transacción, luego crea una sesión con estas opciones:

txnOpts := options.Transaction().SetReadConcern(readconcern.Majority())
sessOpts := options.Session().SetDefaultTransactionOptions(txnOpts)
session, err := client.StartSession(sessOpts)
if err != nil {
return err
}

Nota

Operaciones paralelas no admitidas

El controlador Go no admite la ejecución de operaciones paralelas dentro de una sola transacción.

Si su aplicación está conectada a MongoDB Server v8.0 o posterior, puede realizar operaciones de escritura en varios espacios de nombres dentro de una sola transacción mediante la función de escritura masiva del cliente. Para obtener más información, consulte Sección de escrituramasiva del cliente de la guía de operaciones masivas.

Los ejemplos de esta sección usan la siguiente estructura de Book como el modelo de datos para los documentos que se insertarían en una colección:

type Book struct {
Title string `bson:"title"`
Author string `bson:"author"`
}

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:

  1. Cree una sesión desde el cliente utilizando el método StartSession().

  2. Utilice el método WithTransaction() para iniciar una transacción.

  3. 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.

  4. 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 context.Context) (any, error) {
result, err := coll.InsertMany(ctx, []any{
Book{Title: "The Bluest Eye", Author: "Toni Morrison"},
Book{Title: "Sula", Author: "Toni Morrison"},
Book{Title: "Song of Solomon", Author: "Toni Morrison"},
})
return result, err
}, txnOptions)

Si necesita mayor control sobre sus transacciones, puede crearlas, confirmarlas y finalizarlas manualmente. Este ejemplo muestra cómo realizar las siguientes acciones:

  1. Cree una sesión desde el cliente utilizando el método StartSession().

  2. Utilice el método StartTransaction() para iniciar una transacción.

  3. Insertar múltiples documentos dentro de la transacción.

  4. Confirme la transacción utilizando el método CommitTransaction().

  5. Finalizar 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())
err = mongo.WithSession(context.TODO(), session, func(ctx context.Context) error {
if err = session.StartTransaction(txnOptions); err != nil {
return err
}
docs := []any{
Book{Title: "The Year of Magical Thinking", Author: "Joan Didion"},
Book{Title: "Play It As It Lays", Author: "Joan Didion"},
Book{Title: "The White Album", Author: "Joan Didion"},
}
result, err := coll.InsertMany(ctx, docs)
if err != nil {
return err
}
if err = session.CommitTransaction(ctx); err != nil {
return err
}
fmt.Println(result.InsertedIDs)
return nil
})
if err != nil {
if err := session.AbortTransaction(context.TODO()); err != nil {
panic(err)
}
panic(err)
}

Para obtener más información sobre las operaciones de inserción, consulte la página Fundamentos de Insertar documentos.

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.

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:

Volver

Operaciones de escritura masiva

En esta página