Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

415
Vistas
mangosta no aborta la transacción cuando la promesa. todo rechaza

estoy tratando de guardar varios documentos en una transacción y si estoy usando Promise.all para ejecutar operaciones en paralelo, y uno de ellos falla y la promesa se rechaza, entonces las otras operaciones deberían revertirse, pero no sucede si ejecutando operaciones una por una, entonces funciona como se esperaba

así que aquí está el guión de trabajo:

 import mongoose from "mongoose"; main() .then(() => console.log('done')) .catch(err => console.log(err)); const userSchema = new mongoose.Schema({ email: { type: String, required: true, }, password: { type: String, }, }); const User = mongoose.model('User', userSchema); async function main() { await mongoose.connect('mongodb://127.0.0.1:27017/transaction-test?replicaSet=myReplicaSet'); const users = [ { email: 'cred@mail.ru', password: '123', }, { email: 'buba@mail.ru', password: '123', }, { password: '1234', // no 'email' property so trying to save it will result in validation error }, ]; await User.db.transaction(async session => { const promise1 = User.create([users[0]], { session }); const promise2 = User.create([users[1]], { session }); const promise3 = User.create([users[2]], { session }); await promise1; await promise2; await promise3; }); };

el código anterior funcionará según lo previsto y no se guardará ningún documento en la base de datos, pero si reemplazo la parte de la transacción con:

 await User.db.transaction(async session => { const promise1 = User.create([users[0]], { session }); const promise2 = User.create([users[1]], { session }); const promise3 = User.create([users[2]], { session }); await Promise.all([promise1, promise2, promise3]); }); };

entonces los dos primeros documentos no se revertirán y en realidad se guardarán en la base de datos aunque la función arrojará un error de validación

mangosta versión es 6.1.7 mongod versión v5.0.4

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Prueba con startTransaction y commitTransaction . Algo como esto:

 const session = await mongoose.startSession(); session.startTransaction(); try { const promise1 = User.create([users[0]], { session }); const promise2 = User.create([users[1]], { session }); const promise3 = User.create([users[2]], { session }); await Promise.all([promise1, promise2, promise3]); await session.commitTransaction(); } catch(error){ // Rollback any changes made in the database await session.abortTransaction(); // logging the error console.error(error); // Rethrow the error throw error; } finally { // Ending the session session.endSession(); }
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda