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

Realizar una Transacción

En esta guía, puede aprender cómo utilizar el controlador de Scala para realizar transacciones. Las transacciones permiten realizar una serie de operaciones que cambian datos sólo si la transacción completa está confirmada. Si alguna operación en la transacción no tiene éxito, el driver detiene la transacción y descarta todos los cambios de datos antes de que se hagan visibles. Esta funcionalidad se denomina atomicidad.

En MongoDB, las transacciones se ejecutan dentro de sesiones lógicas. Una sesión es un agrupamiento de operaciones de lectura o guardado relacionadas que desea ejecutar en forma secuencial. Las sesiones permiten la coherencia causal para un grupo de operaciones y permiten ejecutar operaciones en una transacción compatible con ACID, que es una transacción que cumple una expectativa de atomicidad, consistencia, aislamiento y durabilidad. MongoDB garantiza que los datos involucrados en las operaciones de transacción se mantengan coherentes, incluso si las operaciones encuentran errores inesperados.

Al usar el driver de Scala, puedes iniciar un ClientSession llamando al método startSession() en tu cliente. Luego, puedes realizar transacciones dentro de la sesión.

Advertencia

Utilice un ClientSession solo en operaciones que se ejecuten en el MongoClient que lo creó. Usar un ClientSession con un MongoClient diferente da como resultado errores de operación.

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

Método
Descripción

startTransaction()

Inicia una nueva transacción en esta sesión. No se puede iniciar una transacción si ya hay una transacción activa en ejecución en la sesión.

Se pueden configurar las opciones de la transacción pasando una TransactionOptions instancia como parámetro.

commitTransaction()

Confirma la transacción activa de esta sesión. Este método devuelve un error si no hay una transacción activa para la sesión, la transacción finalizó anteriormente o si hay un conflicto de escritura.

abortTransaction()

Termina la transacción activa para esta sesión. Este método devuelve un error si no hay una transacción activa para la sesión o si la transacción fue confirmada o finalizada.

Tip

Tiempo de espera de la transacción

Puedes establecer un límite en la cantidad de tiempo que las operaciones pueden tardar en completarse en tus transacciones. Para obtener más información, consulta la 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 el nivel de confirmación de escritura (write concern) 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 guardar para garantizar que las operaciones no se ejecuten simultáneamente.

A continuación, ejecuta el siguiente código para realizar la transacción. Este código completa las siguientes acciones:

  • Crea una sesión desde el cliente usando 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 driver de Scala no admite la ejecución de operaciones en paralelo dentro de una sola transacción.

Si utilizas MongoDB Server v8.0 o posterior, puedes realizar operaciones de escritura en varios namespaces dentro de una sola transacción utilizando la funcionalidad de escritura masiva del cliente. Para obtener más información sobre esta funcionalidad, consulta la guía Operaciones de escritura masiva.

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

Para aprender más sobre ACID compliance, consulte el articulo Una guía sobre las propiedades ACID en los sistemas de gestió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 de Inserción de Documentos.

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