gpt4 book ai didi

mysql - Rails ActiveRecord 连接 session

转载 作者:太空宇宙 更新时间:2023-11-03 11:48:58 25 4
gpt4 key购买 nike

我在 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

据我所知,第一条语句将导致同一 session 中的下一个 ONE 事务处于“READ UNCOMMITTED”隔离状态,然后隔离将恢复为默认状态。

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

我尝试用谷歌搜索这个主题,但由于我是 Rails 的新手,我找不到任何解释让我明白这一点。任何帮助将不胜感激!

谢谢!

最佳答案

我认为您的所有问题都可以用"is" 来回答。即使在 Rails 3.2 中,与数据库的连接也是由 connection pool 管理的。 .这个池确保每个线程都有自己的专用连接到数据库。池根据每个线程唯一的线程 ID 将连接分配给线程。阅读 docs了解更多信息。

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

顺便说一下,如果您使用的是 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

关于mysql - Rails ActiveRecord 连接 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36718481/

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