Использование вторичной / автономной транзакции в том же потоке - PullRequest
0 голосов
/ 30 апреля 2018

Как управлять открытием и закрытием соединений с базой данных при работе с активными записями и несколькими потоками спрашивает о том, как обрабатывать несколько потоков со своим собственным соединением, каждое.

Я хочу сделать что-то похожее, но не то же самое: в моем отдельном (по умолчанию / главном) потоке в приложении Rails (Rails 4, если это важно, и его нельзя обновить до Rails 5 для этой проблемы), я хочу выполнить код ActiveRecord на отдельном соединении от основного.

т.е. (грубый псевдокод):

MyModel.find(...)....      # works on the normal, basic connection handled by "the system"

conn = ActiveRecord::...   # separate connection only used here
MyModel.find(...)          # original connection
MyModel.create!(..., use_connection: conn) # separate connection only used here
MyModel.find(...)          # original connection
some_obj.do_something(...) # original connection
conn.close                 # separate connection only used here

MyModel.find(...)          # original connection

Вопросы:

  • Я знаю о establish_connection и т. Д., Но эти методы, похоже, предполагают, что существует одна связь; то есть они автоматически закрывают / заменяют исходный или, по крайней мере, так кажется после просмотра API. Как правильно создать новое соединение, чтобы оно не влияло на существующее?
  • Приложение: временная замена соединения по умолчанию невозможна; другой код, такой как some_obj.do_something, должен использовать исходное соединение, даже при работе с MyModel, в примере.
  • Как я могу сказать AR, чтобы фактически использовал новое соединение для этой конкретной линии ? Как правило, в случае модели от модели может быть отдельное соединение, но здесь я хотел бы иметь чисто временное соединение, совершенно не связанное с какой-либо конкретной моделью.

N.B .: Обратите внимание, что я знаю, что я делаю на уровне БД, т. Е. Я знаю, как работают все транзакции, и * не * ищу ActiveRecord::Base#transaction. Я также не просто ищу способы обмануть обработку коммитов AR или что-то в этом роде. Я знаю о проблемах транзакций и производительности, связанных с этим, и приведенный выше пример кода, очевидно, не является реальным кодом или даже близок к нему (требуется обработка исключений и т. Д.). Пожалуйста, не отвечайте с решением проблемы X-Y. Представьте себе «автономную транзакцию» на языке Oracle.

...