![](/img/trans.png)
[英]ActiveRecord::ConnectionNotEstablished (No connection pool with 'primary' found.) without Rails
[英]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事務處於“讀取未提交”隔離狀態,然后隔離將恢復為默認狀態。
我的問題是:我可以確定事務塊將始終在同一會話中執行嗎? 另外,我可以確定在第一條語句和第二條語句之間的同一會話中不會發生其他事務嗎?
我嘗試使用Google搜索該主題,但是由於我是Rails的新手,所以找不到任何使我明白的解釋。 任何幫助,將不勝感激!
謝謝!
我認為您所有的問題都可以回答“是” 。 即使在Rails 3.2中,與數據庫的連接也由連接池管理。 該池可確保每個線程將擁有自己的專用連接到數據庫。 池根據線程的線程ID為每個線程分配唯一的連接。 閱讀文檔以獲取更多信息。
因此,我認為兩個線程不可能同時共享一個連接,因此不能同時共享一個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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.