4

如果我有一堆我正在执行的查询,包装在一个 Activerecord 事务中,是所有这些查询在 1 次往返中发送到数据库(即所有查询发送到数据库,并且响应发回),还是每个查询占用每人1次?

示例代码:

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

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

4

2 回答 2

5

The ActiveRecord::Base.transaction call will make two calls to the database:

  • One to tell the database to start a transaction.
  • And another one when the block exits to tell the database to commit or rollback the transaction.

Each ActiveRecord::Base.connection.execute call also talk to the database. This has to happen as the queries that you execute might raise exceptions or return useful data. In general, each SQL statement is a separate call (i.e. roundtrip) to the database.

Only one database connection will be used though.

于 2013-04-26T03:07:35.563 回答
1

MySQL 将阻止您在一次行程中执行多个查询(这确实减轻了一些讨厌的 SQL 注入可能性,例如小 bobby 表;)

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

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

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


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

query = 您的查询数组

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

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

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

于 2013-04-26T04:38:38.367 回答