【问题标题】:How do I set the isolation level of all my rails transactions如何设置所有 Rails 事务的隔离级别
【发布时间】:2016-03-29 15:00:25
【问题描述】:

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

我使用 postgreSQL 作为我的数据库

【问题讨论】:

标签: ruby-on-rails ruby postgresql


【解决方案1】:

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

  1. Monkeypatch 现有transaction 实现,以便它选择 您想要的隔离级别。 (猴子补丁是不可取的)
  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

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

【讨论】:

  • 您还可以为数据库服务器设置默认的事务隔离级别。编辑 postgresql.conf;寻找 default_transaction_isolation。这会影响该服务器下的所有数据库。一方面,没有比这更全球化的了。另一方面,更改此设置并不适合大多数人。
【解决方案2】:

Rails 不支持设置全局隔离级别,但 Postgres 允许您为会话设置一个。您可以挂钩到 Rails 的连接建立以在每次建立连接时运行命令,认为这方面的技术都依赖于猴子补丁并且可能有问题。

然后配置你的隔离级别:

SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode

虽然这很有趣,但出于可维护性和合理性考虑,我会使用类似 Magnuss's answer 的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多