Привет, ребята, поэтому я создал метод, который генерирует некоторые данные, создавая временную таблицу PostgreSQL, а затем использует ее в другом запросе. У меня вопрос: если несколько клиентов будут вызывать эту функцию, буду ли я создавать и удалять свою временную таблицу несколько раз за одну транзакцию? Или при каждом вызове подключения ActiveRecord я делаю совершенно отдельную транзакцию? Чтобы уточнить это мой код:
TEMP_TBL_NAME = "temp_tbl"
def self.generate_exclusions(rules, base_query, rule_attrs)
begin
ActiveRecord::Base.connection.execute(
"DROP TABLE IF EXISTS #{TEMP_TBL_NAME};")
# create a temp table with all rule fields
ActiveRecord::Base.connection.execute(
"CREATE TEMP TABLE #{TEMP_TBL_NAME} AS #{base_query}")
qs = rules.map do |rule|
self.rule_query_instance(rule, rule_attrs)
end.compact.join(" UNION ")
ActiveRecord::Base.connection.execute(qs).to_a
ensure
ActiveRecord::Base.connection.execute(
"DROP TABLE IF EXISTS #{TEMP_TBL_NAME};")
end
end
Итак, еще раз, если несколько клиентов вызывают этот метод, каждый экземпляр ActiveRecord :: Base.connection.execute (бла-бла-бла) создает совершенно новую транзакцию? И если каждая транзакция на самом деле является отдельной, то мне не пришлось бы беспокоиться о том, чтобы несколько клиентов использовали правильный метод? Если это все одна транзакция, созданная заранее, то как мне лучше всего решить проблему, когда несколько клиентов постоянно создают и удаляют эту временную таблицу в одной транзакции?
Также я предполагаю, что я мог бы улучшить свой код, добавив ON COMMIT DROP в мой запрос CREATE TEMP TABLE, чтобы мне не приходилось проверять существование, чтобы отбрасывать каждый раз, вместо этого отбрасывая в конце транзакции.
Спасибо за помощь.