support/db: Support concurrent queries in a transaction #2024
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
PR Checklist
PR Structure
otherwise).
services/friendbot
, orall
ordoc
if the changes are broad or impact manypackages.
Thoroughness
.md
files, etc... affected by this change). Take a look in the
docs
folder for a given service,like this one.
Release planning
needed with deprecations, added features, breaking changes, and DB schema changes.
semver, or if it's mainly a patch change. The PR is targeted at the next
release branch if it's not a patch change.
What
This commit adds
Synchronized
flag tosupport/db.Session
. When set totrue
andSession
runs a transaction allExec*
andSelect*
methods are protected by mutex what allows running them in multiple goroutines.This is an experimental feature (see below) and not a breaking change (default is
false
).Why
Postgres protocol does not allow sending Exec query results if previously sent Query haven't been fully read. This issue manifested itself when a PR that's sending read and write queries in multiple goroutines was merged.
More info: lib/pq#81 lib/pq#635
Known limitations
Synchonized
flag todb.Session
#1983). We are adding this to unblock development of new ingestion processors with a more readable code (currently all database processors are merged into one big processor that is hard to read and test). SplittingDatabaseProcessor
will be done in a separate PR/PRs.SynchronizedSession
struct embeddingdb.Session
inside that would not be placed in a sharedsupport
package. The problem is thathistory.Q
embedsdb.Session
inside. Changing this todb.SessionInterface
requires updating a lot of files that createhistory.Q
objects, tests and mocks. Given that we may want to revert this change in the future, the change in this commit seems to be simpler.