mirror of
https://github.com/element-hq/synapse.git
synced 2026-11-04 13:28:04 +00:00
Every transaction on the native driver sent `BEGIN` on its own and waited for it before the first statement: one round trip per transaction that did nothing but open it. The `BEGIN` now goes out in front of the first statement's first request: its execution if the connection has the statement cached, its prepare otherwise. tokio-postgres queues a request when its future is first polled, so joining the two puts them on the wire in order, and Postgres runs the statement inside the transaction. This applies to Python's transactions (`Connection::with_client`, through a `PendingBegin` each statement method gets) and to Rust's write interactions (`WriteTxn`, whose first statement claims the `BEGIN`). If the `BEGIN` fails, the statement behind it may have run outside a transaction, so the connection is discarded rather than reused. A retry could then apply that statement twice, but `BEGIN ISOLATION LEVEL ...` has no realistic way to fail on the server while the next statement succeeds: a broken connection fails both. A `WriteTxn` that runs no statement now sends neither `BEGIN` nor `COMMIT`. The E2EE monitor's room on jki.re goes from 150 to 135 round trips, a plain room from 104 to 93. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PVLsNh6akt4ifEizY4D1ta