Search code examples
ruby-on-railsrubyactiverecordtransactionsisolation-level

How to set transaction isolation level using ActiveRecord connection?


I need to manage transaction isolation level on a per-transaction basis in a way portable across databases (SQLite, PostgreSQL, MySQL at least).

I know I can do it manually, like that:

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

...but I would expect something like:

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

Solution

  • This functionality is supported by ActiveRecord itself:

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

    It supports the ANSI SQL isolation levels:

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

    This method is available since Rails 4, it was unavailable when the OP asked the question. But for any decently modern Rails application this should be the way to go.