Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

Transacciones

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.

Una vez que inicies una sesión utilizando el método StartSession() en tu cliente, podrás modificar el estado de la sesión usando el método set proporcionado por el Session retornado. La siguiente tabla describe estos métodos:

Método
Descripción

StartTransaction()

Inicia una nueva transacción, configurada con las opciones especificadas, en esta sesión. Devuelve un error si ya hay una transacción en curso para la sesión. Para obtener más información sobre este método, consulte la página startTransaction() en el manual del servidor.

Parámetro: TransactionOptions
Tipo de retorno: error

AbortTransaction()

Finaliza la transacción activa de esta sesión. Devuelve un error si no hay ninguna transacción activa en la sesión o si la transacción ya se ha confirmado o finalizado. Para obtener más información sobre este método, consulte la página abortTransaction() del manual del servidor.

Parámetro: Context
Tipo de retorno: error

CommitTransaction()

Confirma la transacción activa de esta sesión. Devuelve un error si no hay ninguna transacción activa o si la transacción ha finalizado. Para obtener más información sobre este método, consulte la página commitTransaction() en el manual del servidor.

El CommitTransaction() método es una función idempotente, lo que significa que puede intentar confirmar una transacción varias veces sin modificar los datos tras la primera confirmación exitosa. Una transacción puede tener éxito, pero devolver un error con la UnknownTransactionCommitResult etiqueta. Si vuelve a ejecutar el CommitTransaction() método tras recibir este error, los intentos posteriores no modificarán sus datos.


Parámetro: Context
Tipo de retorno: error

WithTransaction()

Inicia una transacción en esta sesión y ejecuta la fn función de devolución de llamada.

Contextfn func(ctx SessionContext)Parámetros:,, TransactionOptions
Tipo deany retorno:, error

EndSession()

Finaliza cualquier transacción existente y cierra la sesión.

Parámetro: Context
Tipo de retorno: ninguno

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

Puede establecer opciones a nivel de sesión y a nivel de transacción para personalizar el rendimiento de la transacción por parte del controlador. Los siguientes pasos describen cómo establecer opciones para todas las transacciones que se ejecuten dentro de un(a) determinado(a) Session:

  1. Cree una instancia de TransactionOptions. Puedes especificar opciones como nivel de confirmación de escritura (write concern), nivel de consistencia de lectura y preferencia de lectura para todas las transacciones ejecutadas en una sesión dada.

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

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

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

El siguiente código especifica 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 en paralelo dentro de una sola transacción.

Si tu aplicación está conectada a MongoDB Server v8.0 o posterior, puedes realizar escrituras en varios espacios de nombres dentro de una sola transacción utilizando la funcionalidad de escritura en bloque del cliente. Para obtener más información, consulta la sección Escrituras masivas de clientes 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 usando el método StartSession().

  2. Utiliza 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. Cierra 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 requiere más control sobre sus transacciones, puede crearlas, comprometerlas y finalizarlas manualmente. Este ejemplo demuestra cómo realizar las siguientes acciones:

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

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

  3. Inserte varios documentos dentro de la transacción.

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

  5. Termina 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, consulta la página de conceptos básicos Insertar documentos.

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.

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: