【发布时间】:2016-03-29 15:00:25
【问题描述】:
我使用的是 RoR 版本 4.2.3,并且我知道我可以设置我的事务的隔离级别。但是,我在哪里定义设置所有事务的隔离级别?所以我只需要定义一次就不用担心了吗?
我使用 postgreSQL 作为我的数据库
【问题讨论】:
标签: ruby-on-rails ruby postgresql
我使用的是 RoR 版本 4.2.3,并且我知道我可以设置我的事务的隔离级别。但是,我在哪里定义设置所有事务的隔离级别?所以我只需要定义一次就不用担心了吗?
我使用 postgreSQL 作为我的数据库
【问题讨论】:
标签: ruby-on-rails ruby postgresql
似乎没有全局隔离选项,因此您有四个选项:
transaction 实现,以便它选择
您想要的隔离级别。 (猴子补丁是不可取的)在整个应用程序中使用正确的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
将来,这将允许您在一处更改隔离级别。
【讨论】:
Rails 不支持设置全局隔离级别,但 Postgres 允许您为会话设置一个。您可以挂钩到 Rails 的连接建立以在每次建立连接时运行命令,认为这方面的技术都依赖于猴子补丁并且可能有问题。
然后配置你的隔离级别:
SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode
虽然这很有趣,但出于可维护性和合理性考虑,我会使用类似 Magnuss's answer 的内容。
【讨论】: