когда следует использовать транзакцию ActiveRecord? - PullRequest
0 голосов
/ 01 марта 2012

Что считается «лучшей практикой» или общим эмпирическим правилом, когда что-то должно быть заключено в блок транзакции?

Это в первую очередь именно тогда, когда вы собираетесь выполнять действия с набором вещей, а вы хотите откатиться, если что-то сломается?Что-то вроде:

class User < ActiveRecord::Base
  def mark_all_posts_as_read!
    transaction do
      posts.find_each { |p| p.update_attribute(:read, true) }
    end 
  end
end

Существуют ли другие сценарии, в которых было бы полезно выполнять операции внутри транзакции?

1 Ответ

1 голос
/ 01 марта 2012

Я не уверен, что это подходит для использования в транзакции: обычно я использую транзакцию в модели, только если состояние одного объекта зависит от состояния другого объекта. Если состояние какого-либо объекта неверно, я не хочу, чтобы либо был зафиксирован.

Классическим примером, конечно же, являются банковские счета. Если вы переводите деньги с одного счета на другой, вы не хотите добавлять их на принимающий счет, сохранять, а затем списывать их с отправляющего счета. Если что-то пойдет не так, деньги просто исчезнут, и у вас появятся довольно злые клиенты. Выполнение обеих частей в одной транзакции гарантирует, что в случае возникновения ошибки ни одна из них ничего не передаст в базу данных.

Документация по транзакциям ActiveRecord проделывает удивительно хорошую работу по обсуждению того, как и почему используются транзакции ... и всегда есть статья Википедии , если вам нужна дополнительная информация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...