Rails-транзакция: имеет значение, на каком классе модели ActiveRecord?
Когда у меня есть 2 объекта для сохранения внутри транзакции
a = A.new(...)
b = B.new(...)
Имеет ли значение, на каком классе модели я вызываю метод транзакции?
A.transaction do
a.save
b.save
end
или
B.transaction do
a.save
b.save
end
IMNO используют одну и ту же транзакцию db, потому что ActiveRecord может обрабатывать только одно соединение, поэтому это не имеет значения. Это правильно?
Спасибо,
Алекс.
Ответы
Ответ 1
Да, вы правильно указали, что оба класса используют одно и то же соединение с базой данных. Класс может использовать establish_connection
для подключения к другой базе данных, но вы бы знали, выполняете ли вы это. Поэтому, поскольку вы правильно предлагаете использовать A.transaction
или B.transaction
, это хорошо.
Если они используют разные базы данных, вы можете вложить вызовы транзакций:
A.transaction do
B.transaction do
...
end
end
но в этом случае это не обязательно.
Ответ 2
Абсолютно верно. Из Rails API docs:
Хотя метод класса транзакции вызывается в классе Active Record, объекты внутри блока транзакций не обязательно должны быть экземплярами этого класса. Это связано с тем, что транзакции - это подключение по каждой базе данных, а не для каждой модели.