PostgreSQL требует выполнения SET TRANSACTION
операторов после начала транзакции и перед любым оператором DML (SELECT, INSERT, DELETE и т. Д.). Из документации видно, что все это должно быть сделано через объект подключения, а не объект транзакции. Что-то вроде (не проверено)
Topic.connection.begin_db_transaction
Topic.connection.execute('SET TRANSACTION ISOLATION LEVEL SERIALIZABLE')
# Other things go here. I'd test with another literal SQL statement to make
# sure it works like I'd hope it does. Then possibly try rewriting in Rails.
Topic.connection.commit_db_transaction
Я действительно надеюсь, я ошибаюсь.
Одна неприятная альтернатива - изменить уровень изоляции по умолчанию для всех транзакций на сервере PostgreSQL. (Поиск http://www.postgresql.org/docs/current/static/runtime-config-client.html для "default_transaction_isolation".) Но это похоже на использование пушки, чтобы убить муху.