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

347
Vistas
Cómo se comporta ActiveRecord::Rollback en bloques de inicio-rescate anidados

Tengo el siguiente código

 ActiveRecord::Base.transaction do begin account.save # outer statement begin user.save # inner statement rescue StandardError raise ActiveRecord::Rollback end rescue StandardError raise ActiveRecord::Rollback end end

Si hay una excepción en la 'declaración interna', solo se revertirá el 'usuario', ¿verdad? 'cuenta' no se revertirá en ese caso, ¿no es así?

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

0

En su código hay una sola transacción de base de datos, y es todo o nada. Revertir una transacción revertirá todos los cambios realizados en esa transacción, independientemente de dónde emita la reversión.

También puede anidar transacciones, pero tenga cuidado de que, de forma predeterminada, las transacciones se agrupan, por lo que incluso si agrega una segunda transacción dentro de la primera transacción:

 ActiveRecord::Base.transaction do begin account.save # outer statement ActiveRecord::Base.transaction do begin user.save # inner statement rescue StandardError raise ActiveRecord::Rollback end end rescue StandardError raise ActiveRecord::Rollback end end

Esto aún dará como resultado la transacción única, y la reversión cancelará todos los cambios.

Para solicitar una subtransacción real, debe agregar request_new: true a la transacción interna:

 ActiveRecord::Base.transaction do begin account.save # outer statement ActiveRecord::Base.transaction(require_new: true) do begin user.save # inner statement rescue StandardError raise ActiveRecord::Rollback end end rescue StandardError raise ActiveRecord::Rollback end end

Sin embargo , por el momento, la única base de datos que admite transacciones anidadas verdaderas es MS-SQL. Rails en este momento maneja esto usando puntos de guardado, así que no se confunda con los registros.

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