[Bug/Data] Keine Transaktionen bei mehrstufigen Schreibvorgaengen #50

Closed
opened 2026-09-09 20:17:01 +00:00 by Aceless · 1 comment
Owner

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 IDbConnection als 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.

## 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 `IDbConnection` als 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.
Author
Owner

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.
  • DeleteSpaceAsync und DeleteRecipeInSpace: Bildpfade einsammeln und löschen in einer Transaktion.

IDbConnection kommt jetzt aus einer NpgsqlDataSource als Singleton, das Pooling bleibt erhalten.


Branch backend/issue-fixes, Commits 026544c, c59a727, 3957404.

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. - `DeleteSpaceAsync` und `DeleteRecipeInSpace`: Bildpfade einsammeln und löschen in einer Transaktion. `IDbConnection` kommt jetzt aus einer `NpgsqlDataSource` als Singleton, das Pooling bleibt erhalten. --- Branch `backend/issue-fixes`, Commits 026544c, c59a727, 3957404.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
Aceless/RecipePlanner#50
No description provided.