Khi sử dụng transaction trong RoR, có lúc ta không cần phải gọi câu lệnh ActiveRecord::Rollback , cũng có lúc ta phải gọi nó.

Xét ví dụ:

self.transaction do
  first_operation
  begin
    second_operation
    call_other_function
  rescue Exception => e
      #deal with the error
      raise ActiveRecord::Rollback #force a rollback
  end
end
  • Nếu bỏ raise ActiveRecord::Rollback : Mọi thay đổi tới DB xảy ra ở second_operation và call_other_function đều được rollback trong trường hợp có lỗi xảy ra ở 2 chỗ đấy nhưng first_operation sẽ không được rollback
  • Nếu bạn muốn cả first_operation phải được rollback thì bạn phải gọi raise ActiveRecord::Rollback như đoạn code trên.

 

Link tham khảo:

https://stackoverflow.com/questions/2700727/does-rails-do-a-rollback-if-i-use-begin-rescue