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!

Respuestas a la pregunta(1)

Su respuesta a la pregunta