2012-03-01 4 views
0

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

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

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

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

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

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

+0

Я также использую транзакции в рейк-задачах. Я собираю много данных навалом из API, а затем делаю блок транзакций вокруг задачи 'create', чтобы ускорить вставку ... только одно соединение используется для команд вставки, а не для открытия и закрытия соединения для каждой задачи. – ScottJShea

Смежные вопросы