MaybeT und Transaktionen in runDb
Für meine vorherige Frage zu Verkettungsfehlern hatte Michael Snoyman vorgeschlagen, dass ich @ verwendMaybeT
, um sie auszuführen. Wenn einer von ihnen fehlschlägt, wird nur ein Kurzschluss nach @ ausgeführNothing
.
Ich hatte den EindruckrunDb
führt alles in einer Transaktion aus. Sollte also ein Fehler an keiner Stelle im Code die Transaktion automatisch zurücksetzen?
mauth <- runDb $ runMaybeT $ do
valid <- MaybeT $ return $ listToMaybe errs
uid <- MaybeT $ insertUnique u
vid <- MaybeT $ getBy $ UniqueField v -- this step fails but previous insert does not roll back
auth <- liftIO $ createAuthToken uid
return auth
Wenn ich den obigen Code ausführe, wird dasgetBy
schlägt fehl, aber Benutzer wurde noch eingefügt. Verstehe ich das falschrunDb
wird auf einem @ zurückgesetNothing
InnerhalbMaybeT
? Muss ich eine andere Monade verwenden, damit dies funktioniert?
Bewerten Sie Ihre Überlegungen, wie Sie bei Fehlern am besten ein Rollback durchführen können.
Aktualisiere: Dies ist, was ich auf Michaels Vorschlag hin getan habe.
mauth <- runDb $ do
ma <- runMaybeT $ do
valid <- ...
case ma of
Just _ -> return ma
Nothing -> liftIO $ throwIO MyException
Nun muss ich herausfinden, wie ich diese Ausnahme schön draußen abfangen und eine richtige Fehlermeldung zurückgeben kann.
Vielen Dank