如何使用ActiveRecord连接设置事务隔离级别



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

我知道我可以手动完成,比如:

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

但我希望有这样的东西:

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

ActiveRecord本身支持此功能:

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

它支持ANSI SQL隔离级别:

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

这个方法从Rails4开始就可用了,当OP问这个问题时它就不可用了。但对于任何一个相当现代的Rails应用程序来说,这应该是一条路。

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

Looks Rails4将具有开箱即用的功能:

https://github.com/rails/rails/commit/392eeecc11a291e406db927a18b75f41b2658253

相关内容

  • 没有找到相关文章

最新更新