我正在使用RoR版本4.2.3,並且我明白我可以設置我的交易的隔離級別。但是,我在哪裏定義設置所有事務的隔離級別?所以我只需要定義一次,然後不用擔心呢?如何設置我所有鐵路交易的隔離級別
我使用PostgreSQL作爲我的數據庫
我正在使用RoR版本4.2.3,並且我明白我可以設置我的交易的隔離級別。但是,我在哪裏定義設置所有事務的隔離級別?所以我只需要定義一次,然後不用擔心呢?如何設置我所有鐵路交易的隔離級別
我使用PostgreSQL作爲我的數據庫
似乎有沒有成爲一個全球性的隔離選項
,所以你只剩下四個選項:
transaction
實施,使它挑選您想要的隔離級別的 。 (Monkeypatching不可取)在整個應用程序中使用正確的isolation
級別。
SomeModel.transaction(isolation: :read_committed)
擴展ActiveRecord
,並創建自己的自定義交易方法。
正如評論 - 您可能能夠編輯數據庫配置中的默認隔離級別。 Postgres的是this one
示例代碼:
#lib/activerecord_extension.rb
module ActiveRecordExtension
extend ActiveSupport::Concern
module ClassMethods
def custom_transaction
transaction(isolation: :read_committed) do
yield
end
end
end
end
ActiveRecord::Base.send(:include, ActiveRecordExtension)
然後在您的初始化:
#config/initializers/activerecord_extension.rb
require "active_record_extension"
之後,您可以使用:
MyModel.custom_transaction do
<...>
end
而在未來,這將允許您可以在一個地方更改隔離級別。
你可以還要爲數據庫服務器設置默認的事務隔離級別。編輯postgresql.conf;尋找default_transaction_isolation。這會影響該服務器下的所有數據庫。一方面,你不能獲得比這更多的全球化。另一方面,更改此設置不適用於大多數人。 –
Rails不支持設置全局隔離級別,但Postgres允許您爲會話設置一個。你可以勾起Rails的連接建立來每次連接時運行一個命令,認爲這些技術都依賴monkeypatching,可能是有問題的。
然後配置你的隔離級別:
SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode
雖然這是有趣的,我會用更多的東西一樣Magnuss's answer可維護性和理智去。
我相信這是一個重複的http://stackoverflow.com/questions/29583303/how-to-set-a-ruby-on-rails-4-apps-default-db-isolation-level – phylae