Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Transacciones

En esta guía, puedes aprender cómo usar el MongoDB Go Driver para realizar transacciones. Transacciones le permiten ejecutar una serie de operaciones que no cambian ningún dato hasta que la transacción es confirmada. Si alguna operación en la transacción devuelve un error, el driver cancela la transacción 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 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 utilizar el driver de Go, puede crear una nueva sesión desde un Client instancia 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.

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

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: interface{}, error

EndSession()

Ends any existing transactions and closes the session.

Parameter: Context
Return Type: none

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.

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. Crear una sesión desde el cliente utilizando 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 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.

Para obtener más información sobre las operaciones de inserción, consulta la Insertar un documento en la página de fundamentos.

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:

Volver

Indexes

En esta página