Docs Menu
Docs Home
/ /

Realizar una transacción

En esta guía, aprenderá a usar el controlador de Scala para realizar transacciones. Las transacciones permiten realizar una serie de operaciones que modifican los datos solo si se confirma la transacción completa. Si alguna operación de la transacción no se realiza correctamente, el controlador la detiene y descarta todos los cambios en los datos antes de que sean visibles. Esta característica se denomina atomicidad.

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 de un grupo de operaciones y ejecutar operaciones en una transacción compatible con ACID, que cumple con los requisitos de atomicidad, consistencia, aislamiento y durabilidad. MongoDB garantiza que los datos involucrados en las transacciones se mantengan consistentes, incluso si se producen errores inesperados.

Al utilizar el controlador Scala, puede iniciar un ClientSession Al llamar al método startSession() en su cliente, podrá realizar transacciones dentro de la sesión.

Advertencia

Use un ClientSession solo en operaciones que se ejecuten en el MongoClient que lo creó. Usar un ClientSession con un MongoClient diferente genera errores de operación.

Después de llamar al método startSession() para iniciar una sesión, puede usar métodos de la clase ClientSession para modificar el estado de la sesión. La siguiente tabla describe los métodos que puede usar para gestionar una transacción:

Método
Descripción

startTransaction()

Starts a new transaction on this session. You cannot start a transaction if there's already an active transaction running in the session.

You can set transaction options by passing a TransactionOptions instance as a parameter.

commitTransaction()

Commits the active transaction for this session. This method returns an error if there is no active transaction for the session, the transaction was previously ended, or if there is a write conflict.

abortTransaction()

Ends the active transaction for this session. This method returns an error if there is no active transaction for the session or if the transaction was committed or ended.

Tip

Tiempo de espera de transacción

Puede establecer un límite de tiempo para completar las operaciones de sus transacciones. Para obtener más información, consulte Sección Transacciones de la guía Limitar el tiempo de ejecución del servidor.

Este ejemplo define un método runTransaction() que modifica datos en las colecciones de la base de datos sample_mflix. El código realiza las siguientes acciones:

  • Crea MongoCollection instancias para acceder a las colecciones movies y users

  • Especifica la preocupación de lectura y escritura para la transacción

  • Inicia la transacción

  • Inserta un documento en la colección movies e imprime los resultados

  • Actualiza un documento en la colección users e imprime los resultados

def runTransaction(
database: MongoDatabase,
observable: SingleObservable[ClientSession]
): SingleObservable[ClientSession] = {
observable.map(clientSession => {
val moviesCollection = database.getCollection("movies")
val usersCollection = database.getCollection("users")
val transactionOptions = TransactionOptions
.builder()
.readConcern(ReadConcern.SNAPSHOT)
.writeConcern(WriteConcern.MAJORITY)
.build()
// Starts the transaction with specified options
clientSession.startTransaction(transactionOptions)
// Inserts a document into the "movies" collection
val insertObservable = moviesCollection.insertOne(
clientSession,
Document("name" -> "The Menu", "runtime" -> 107)
)
val insertResult = Await.result(insertObservable.toFuture(), Duration(10, TimeUnit.SECONDS))
println(s"Insert completed: $insertResult")
// Updates a document in the "users" collection
val updateObservable = usersCollection.updateOne(
clientSession,
equal("name", "Amy Phillips"), set("name", "Amy Ryan")
)
val updateResult = Await.result(updateObservable.toFuture(), Duration(10, TimeUnit.SECONDS))
println(s"Update completed: $updateResult")
clientSession
})
}

Nota

Dentro de una transacción, las operaciones deben ejecutarse en secuencia. El código anterior espera el resultado de cada operación de escritura para garantizar que no se ejecuten simultáneamente.

Luego, ejecute el siguiente código para realizar la transacción. Este código realiza las siguientes acciones:

  • Crea una sesión desde el cliente utilizando el método startSession()

  • Llama al método runTransaction() definido en el ejemplo anterior, pasando la base de datos y la sesión como parámetros

  • Confirma la transacción llamando al método commitTransaction() y espera a que se completen las operaciones.

val client = MongoClient("<connection string>")
val database = client.getDatabase("sample_mflix")
val session = client.startSession();
val transactionObservable: SingleObservable[ClientSession] =
runTransaction(database, session)
val commitTransactionObservable: SingleObservable[Unit] =
transactionObservable.flatMap(clientSession => clientSession.commitTransaction())
Await.result(commitTransactionObservable.toFuture(), Duration(10, TimeUnit.SECONDS))
Insert completed: AcknowledgedInsertOneResult{insertedId=BsonObjectId{value=...}}
Update completed: AcknowledgedUpdateResult{matchedCount=1, modifiedCount=1, upsertedId=null}

Nota

Operaciones paralelas no admitidas

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

Si usa 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 sobre esta función, consulte la guía "Operaciones de escritura masiva".

Para obtener más información sobre los conceptos mencionados en esta guía, consulte las siguientes páginas del manual de MongoDB Server:

  • Transacciones

  • Sesiones de servidor

  • Leer Aislamiento, Coherencia y Recencia

Para obtener más información sobre el cumplimiento de ACID, consulte el artículo Una guía de propiedades ACID en sistemas de administración de bases de datos en el sitio web de MongoDB.

Para obtener más información sobre las operaciones de inserción, consulte la guía Insertar documentos.

Para obtener más información sobre los métodos y tipos mencionados en esta guía, consulte la siguiente documentación de API:

Volver

Operaciones de escritura masiva

En esta página