如何使用ActiveRecord连接设置事务隔离级别? [推荐宝石]

时间:2012-02-03 10:20:10

标签: ruby-on-rails ruby activerecord transactions isolation-level

我需要在数据库中以可移植的方式管理每个事务的事务隔离级别(至少SQLite,PostgreSQL,MySQL)。

你能推荐一个 gem ,它可以增强ActiveRecord数据库连接适配器吗?

我知道我可以手动执行此操作:

User.connection.execute('SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE')

......但我会期待类似的事情:

User.isolation_level( :serializable ) do
  # ...
end

3 个答案:

答案 0 :(得分:25)

ActiveRecord本身支持此功能:

MyRecord.transaction(isolation: :read_committed) do
  # do your transaction work
end

它支持ANSI SQL隔离级别:

  • :read_uncommitted
  • :read_committed
  • :repeatable_read
  • :serializable

此方法可用since Rails 4,当OP提出问题时,该方法无效。但对于任何体面的现代Rails应用程序,这应该是可行的方法。

答案 1 :(得分:12)

没有可用的宝石所以我开发了一个(MIT):https://github.com/qertoip/transaction_isolation

答案 2 :(得分:12)