[Bug/Data] Keine Transaktionen bei mehrstufigen Schreibvorgaengen #50
Labels
No labels
bug
critical
database
duplicate
enhancement
help wanted
invalid
performance
question
refactoring
security
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
Aceless/RecipePlanner#50
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem
Mehrere Operationen bestehen aus mehreren unabhaengigen Statements ohne Transaktion:
RecipeRepository.CreateRecipeInSpace: Rezept, Zutaten, Schritte, Tags, SuitableFor sind fuenf getrennte Aufrufe.RecipeRepository.UpdateRecipeInSpace: erst DELETE, dann INSERT je Kindtabelle. Bricht es dazwischen ab, ist das Rezept ohne Zutaten oder Schritte.SpaceRepository.CreateSpaceAsync: Space anlegen und Mitgliedschaft anlegen. Faellt der zweite Teil aus, existiert ein Space, den niemand sehen kann.Da
IDbConnectionals Scoped registriert und von Dapper je Statement geoeffnet und geschlossen wird, laeuft jedes Statement im Autocommit.Fix
Verbindung explizit oeffnen,
BeginTransaction(), die Transaktion an jeden Dapper-Aufruf durchreichen und am Ende committen. Sinnvollerweise gekapselt in einer kleinen Hilfsmethode oder einem Unit-of-Work, damit die Repositories nicht jeweils eigene Verbindungsverwaltung bekommen.Erledigt.
Neu:
Infrastructure/DbConnectionExtensions.BeginTransactionAsync, das die Verbindung bei Bedarf öffnet. Die Transaktion wird an jeden Dapper-Aufruf durchgereicht.Umgestellt sind:
CreateRecipeInSpace: Rezept, Zutaten, Schritte, Tags und Mealtypes in einer Transaktion.UpdateRecipeInSpace: DELETE und INSERT je Kindtabelle in einer Transaktion.CreateSpaceAsync: Space und Mitgliedschaft in einer Transaktion.DeleteSpaceAsyncundDeleteRecipeInSpace: Bildpfade einsammeln und löschen in einer Transaktion.IDbConnectionkommt jetzt aus einerNpgsqlDataSourceals Singleton, das Pooling bleibt erhalten.Branch
backend/issue-fixes, Commits026544c,c59a727,3957404.