mirror of
https://github.com/element-hq/synapse.git
synced 2026-08-15 13:30:47 +00:00
`new_transaction` sets a transaction's isolation level (for the receipts, push-actions and purge paths, which ask for a specific level) by calling `engine.attempt_to_set_isolation_level` before the transaction and resetting it after. The Rust engine raised `NotImplementedError` there, so those transactions errored out on the Rust backend. The shim has no psycopg2-style `conn.set_isolation_level`, so implement it in SQL: run `SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL <level>` on the connection. That sets the session's default for *subsequent* transactions, so it's committed before the caller's transaction begins (SET is transactional); `new_transaction` resets it to the default (REPEATABLE READ, which the pool already applies at connection setup) afterwards, scoping the override to the one transaction — matching psycopg2's behaviour. The level name comes from a fixed `IsolationLevel` map, not caller input. Fixes the isolation-level failures in tests.storage.test_event_push_actions, tests.storage.test_purge and tests.storage.test_receipts on the Rust backend (20/20 pass); psycopg2 and sqlite are unaffected. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W3G4M92AmwSSZCbmtMJU3d