A round of corrections to how the application talks to each tenant database, plus meaningful speed-ups on several list screens.
Tenant Database Isolation and Transaction Correctness
Several long-standing defects in how the application binds work to a tenant’s own database have been corrected together.
- The tenant switch is now isolated per request thread, so two concurrent requests can no longer influence each other
- Transactions are bound to the database their writes actually go to — which is what makes a rollback roll the right thing back, and a report-only run genuinely write nothing
- One connection per request, so a nested transaction behaves as one
- Fallback reads open a savepoint, so a query that was expected to fail can no longer leave the rest of the request failing behind it
- Tenant provisioning no longer disturbs the shared connection
Bulk Tenant Migration Reports Progress and Survives Long Runs
Bulk schema updates across many tenants now stream per-database progress instead of going quiet, carry a configurable timeout long enough for a large tenant, and surface the real diagnostic when one database fails. Static files are also collected before migrations run, so a single failing tenant can no longer take the interface down with it.
Faster List and Detail Screens
Three list and detail endpoints were issuing a separate database query for every row they returned. They now fetch what they need in one pass, and the screens load noticeably faster on large data sets.