Ruby on Rails
Активные транзакции ActiveRecord
Поиск…
Вступление
Транзакции ActiveRecord являются защитными блоками, в которых последовательность активных запросов записи является постоянной, если все они могут выполняться как одно атомное действие.
Начало работы с активными транзакциями
Активные транзакции записи могут применяться к классам модели, а также к экземплярам модели, объекты внутри блока транзакций не обязательно должны быть экземплярами одного класса. Это связано с тем, что транзакции - это подключение по каждой базе данных, а не для каждой модели. Например:
User.transaction do
account.save!
profile.save!
print "All saves success, returning 1"
return 1
end
rescue_from ActiveRecord::RecordInvalid do |exception|
print "Exception thrown, transaction rolledback"
render_error "failure", exception.record.errors.full_messages.to_sentence
end
Использование save с помощью bang гарантирует, что транзакция будет автоматически откатываться при возникновении исключения, и после откат управление переходит к блоку аварийного восстановления для исключения. Удостоверьтесь, что вы спасаете исключения, выброшенные из сохранения! в блоке транзакций.
Если вы не хотите использовать save !, вы можете вручную поднять raise ActiveRecord::Rollback
когда сбой не удался. Вам не нужно обрабатывать это исключение. Затем он откатит транзакцию и переведет элемент управления в следующий оператор после блока транзакций.
User.transaction do
if account.save && profile.save
print "All saves success, returning 1"
return 1
else
raise ActiveRecord::Rollback
end
end
print "Transaction Rolled Back"