我需要以跨数据库(至少是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