2015-12-23 37 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可维护性和理智去。

相关问题