2015-12-23 57 views
0

我正在使用RoR版本4.2.3,並且我明白我可以設置我的交易的隔離級別。但是,我在哪裏定義設置所有事務的隔離級別?所以我只需要定義一次,然後不用擔心呢?如何設置我所有鐵路交易的隔離級別

我使用PostgreSQL作爲我的數據庫

+0

我相信這是一個重複的http://stackoverflow.com/questions/29583303/how-to-set-a-ruby-on-rails-4-apps-default-db-isolation-level – phylae

回答

3

似乎有沒有成爲一個全球性的隔離選項 ,所以你只剩下四個選項:

  1. 猴補丁現有transaction實施,使它挑選您想要的隔離級別的 。 (Monkeypatching不可取)
  2. 在整個應用程序中使用正確的isolation級別。

    SomeModel.transaction(isolation: :read_committed)

  3. 擴展ActiveRecord,並創建自己的自定義交易方法。

  4. 正如評論 - 您可能能夠編輯數據庫配置中的默認隔離級別。 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 

而在未來,這將允許您可以在一個地方更改隔離級別。

+0

你可以還要爲數據庫服務器設置默認的事務隔離級別。編輯postgresql.conf;尋找default_transaction_isolation。這會影響該服務器下的所有數據庫。一方面,你不能獲得比這更多的全球化。另一方面,更改此設置不適用於大多數人。 –

2

Rails不支持設置全局隔離級別,但Postgres允許您爲會話設置一個。你可以勾起Rails的連接建立來每次連接時運行一個命令,認爲這些技術都依賴monkeypatching,可能是有問題的。

然後配置你的隔離級別:

SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode 

雖然這是有趣的,我會用更多的東西一樣Magnuss's answer可維護性和理智去。

相關問題