Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

341
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!