Quizás T y Transacciones en runDb
Para mi pregunta anterior sobre el encadenamiento de fallas, Michael Snoyman me sugirió que usaraMaybeT
para ejecutarlos, de modo que si alguno de ellos falla, se producirá un cortocircuito paraNothing
.
estaba bajo la impresionrunDb
ejecuta todo en una transacción. Entonces, ¿no debería una falla en cualquier punto del código deshacer automáticamente la transacción?
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
Cuando ejecuto el código anterior, elgetBy
falla pero el usuario aún estaba insertado. ¿Estoy malinterpretando eso?runDb
revertirá en unNothing
dentroMaybeT
? ¿Necesito usar alguna otra mónada para que esto funcione?
Aprecie sus pensamientos sobre cómo revertir mejor el fracaso.
Actualizar: Esto es lo que terminé haciendo por sugerencia de Michael.
mauth <- runDb $ do
ma <- runMaybeT $ do
valid <- ...
case ma of
Just _ -> return ma
Nothing -> liftIO $ throwIO MyException
Ahora necesito descubrir cómo atrapar esta excepción muy bien afuera y devolver un mensaje de error adecuado.
¡Gracias!