Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

348
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda