Подтвердить что ты не робот

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 может обрабатывать только одно соединение, поэтому это не имеет значения. Это правильно?

Спасибо, Алекс.

4b9b3361

Ответ 1

Да, вы правильно указали, что оба класса используют одно и то же соединение с базой данных. Класс может использовать establish_connection для подключения к другой базе данных, но вы бы знали, выполняете ли вы это. Поэтому, поскольку вы правильно предлагаете использовать A.transaction или B.transaction, это хорошо.

Если они используют разные базы данных, вы можете вложить вызовы транзакций:

A.transaction do
  B.transaction do
   ...
  end
end

но в этом случае это не обязательно.

Ответ 2

Абсолютно верно. Из Rails API docs:

Хотя метод класса транзакции вызывается в классе Active Record, объекты внутри блока транзакций не обязательно должны быть экземплярами этого класса. Это связано с тем, что транзакции - это подключение по каждой базе данных, а не для каждой модели.