Транзакции PostgreSQL с использованием Rails ActiveRecord - PullRequest
0 голосов
/ 06 ноября 2018

Привет, ребята, поэтому я создал метод, который генерирует некоторые данные, создавая временную таблицу 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, чтобы мне не приходилось проверять существование, чтобы отбрасывать каждый раз, вместо этого отбрасывая в конце транзакции.

Спасибо за помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...