Rails ActiveRecord 连接会话

Rails ActiveRecord connection session

我在 Rails 3.2 + mySQL 应用程序中有以下代码:

ActiveRecord::Base.connection.execute("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED")
ActiveRecord::Base.transaction do
              @book = ActiveRecord::Base.connection.execute("select * from books limit 1")
end

据我了解,第一条语句将导致同一会话中的下一个 ONE 事务处于 "READ UNCOMMITTED" 隔离状态,然后隔离将 return 设为默认值。

我的问题是:我能确定交易块总是在同一个会话中执行吗?另外,我可以确定在第一条和第二条语句之间的同一会话中不会发生其他事务吗?

我试图 Google 这个主题,但由于我是 Rails 的新手,我找不到任何解释可以让我明白这一点。如有任何帮助,我们将不胜感激!

谢谢!

我想你所有的问题都可以用"YES"来回答。即使在 Rails 3.2 中,与数据库的连接也由 connection pool. This pool ensures that each thread will have its own dedicated connection to the DB. The pool assigns connections to threads based on their Thread IDs which are unique for each thread. Read the docs 管理以获取更多信息。

所以我认为两个线程不应该共享一个连接并因此同时共享一个 MySQL 会话。此外,应该保证事务将始终使用与隔离级别设置代码相同的连接(即在同一会话中)进行调用。

顺便说一句,如果您使用 Rails 4 或更高版本,您可以仅使用 transaction 方法实现相同的行为。不幸的是,在 Rails 3 中不支持以这种方式设置隔离级别。因此,以下示例实际上不适用于您的特定场景:

Book.transaction(:isolation => :read_uncommitted) do
  @book = Book.first
end
# => SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
#    BEGIN
#      SELECT  `books`.* FROM `books`  ORDER BY `books`.`id` ASC LIMIT 1
#    COMMIT