ActiveRecord交易只是往返数据库的一次吗?

时间:2013-04-26 01:54:17

标签: ruby-on-rails ruby activerecord rails-activerecord

如果我正在执行一堆查询,包含在Activerecord事务中,那么所有那些查询都会在一次往返中发送到数据库(即所有查询都发送到db,并且响应已发回),或者每个查询每次占用1次?

示例代码:

ActiveRecord::Base.transaction do   
      queries.each do |query|
           ActiveRecord::Base.connection.execute(query)
      end
end

如果是后者,有没有办法强制在一次往返中执行事务中的所有查询?

2 个答案:

答案 0 :(得分:5)

ActiveRecord::Base.transaction调用将对数据库进行两次调用:

  • 一个告诉数据库开始交易。
  • 另一个当块退出时告诉数据库提交或回滚事务。

每个ActiveRecord::Base.connection.execute调用也与数据库通信。这必须发生在您execute可能引发异常或返回有用数据的查询中。通常,每个SQL语句都是对数据库的单独调用(即往返)。

虽然只会使用一个数据库连接

答案 1 :(得分:1)

MySQL将阻止您在旅行中执行多个查询(这可以缓解一些令人讨厌的SQL注入可能性,例如little bobby tables;)

如果您的数据库支持它,理论上你可以一次性发送它:

ActiveRecord::Base.connection.execute(["BEGIN",*query,"COMMIT",""]*";\n")

请注意“理论上”。实际上不要试图这样做。


如果有人想知道那里发生了什么。

query =您的查询数组

arr = ["BEGIN",*query,"COMMIT",""]只是将查询展平为数组。

arr*";\n"arr.join(";\n")相同。数组末尾的空白提供尾随“;”对于COMMIT。

对于像Ruby Golf这样的东西很有趣,但不要在生产中使用它。你只会伤害那些试图在将来阅读你的代码的人(即使是未来的你。)