Setting isolation level in MySQL 5.1, 5.5, Postgres
From the I-want-my-evening-back department, differences in behaviour when
setting isolation levels between MySQL 5.1, 5.5, and postgres. Documenting here
for my poor future self.
In postgres and MySQL 5.1, the following is the correct ordering:
1 2 3 4 5 6 7 |
ActiveRecord::Base.transaction do ActiveRecord::Base.connection.execute( "SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE" ) # ... end |
On MySQL 5.5 with mysql2
gem, no error will be raised, but the isolation
level will not be set correctly. If you run the same commands in a mysql shell,
you see an error informing that the isolation level cannot be set after the
transaction has started.
Ok well, let’s move it outside then:
1 2 3 4 5 6 |
ActiveRecord::Base.connection.execute( "SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE" ) ActiveRecord::Base.transaction do # ... end |
That works on 5.5, but fails on postgres.