如何设置所有 Rails 事务的隔离级别

Whi*_*ger 1 ruby postgresql ruby-on-rails

我正在使用 RoR 版本 4.2.3,并且我知道我可以设置事务的隔离级别。但是,我在哪里定义设置所有事务的隔离级别呢?所以我只需要定义一次就不用担心了?

我使用 postgreSQL 作为我的数据库

Mag*_*uss 5

似乎没有全局隔离选项,因此您有四个选项:

  1. Monkeypatch 现有的transaction实现,以便它选择您想要的隔离级别。(猴子补丁是不可取的)
  2. isolation在整个应用程序中使用正确的级别。

    SomeModel.transaction(isolation: :read_committed)

  3. 扩展ActiveRecord并创建您自己的自定义交易方法。

  4. 正如评论所述 - 您可以编辑数据库配置中的默认隔离级别。对于 postgres 来说就是这个

示例代码:

#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)
Run Code Online (Sandbox Code Playgroud)

然后在你的初始化器中:

#config/initializers/activerecord_extension.rb
require "active_record_extension"
Run Code Online (Sandbox Code Playgroud)

之后您可以使用:

MyModel.custom_transaction do
  <...>
end
Run Code Online (Sandbox Code Playgroud)

将来,这将允许您在一处更改隔离级别。