gpt4 book ai didi

mysql - 如何在 Rails/ActiveRecord 中的事务之外执行数据库操作

转载 作者:IT王子 更新时间:2023-10-29 00:31:09 26 4
gpt4 key购买 nike

我需要在我的 Rails 应用程序中执行一些原始 SQL。如果查询是在事务中执行的,它确实会导致隐式提交。我们将 MySQL 与 InnoDB 一起使用,查询将包括例如创建表。

使用 ActiveRecord::Base.connection.execute 执行查询会触发隐式提交,这是一个问题。

感觉我只需要一个单独的连接来执行我的查询。 ActiveRecord 可以提供这个吗?我见过关于连接到多个数据库的讨论,但没有看到关于连接到同一数据库的多个连接的讨论。

如果有更好的方法,解决方案不必涉及 ActiveRecord。

我们的 Rails 和 ActiveRecord 版本是 3.2.3。

最佳答案

数据库连接是在每个线程的基础上完成的(这基本上是线程安全所必需的),您可以利用它来发挥自己的优势:例如,只需在单独的线程中执行代码

ActiveRecord::Base.transaction do
# ...
Thread.new do
ActiveRecord::Base.connection.execute "..." # in a new connection
end.join
end

从 rails 4 开始,activerecord 不再自动获取以这种方式创建的连接。为避免泄漏连接,您需要将它们返回到池中。正如 Matt Connelly 所建议的那样,最简单的方法是使用 with_connection 方法,该方法将在 block 的末尾重新检查连接,例如

Thread.new do
ActiveRecord::Base.connection_pool.with_connection do
...
end
end

关于mysql - 如何在 Rails/ActiveRecord 中的事务之外执行数据库操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11674475/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com