@@ -1,4 +1,4 @@
1−{-# LANGUAGE RecordWildCards #-}
1+{-# LANGUAGE RecordWildCards, ScopedTypeVariables #-}
3------------------------------------------------------------------------------
3------------------------------------------------------------------------------
@@ -142,7 +142,7 @@ withTransactionMode :: TransactionMode -> Connection -> IO a -> IO a
142withTransactionMode mode conn act =
142withTransactionMode mode conn act =
143 mask $ \restore -> do
143 mask $ \restore -> do
144 beginMode mode conn
144 beginMode mode conn
145− r <- restore act `E.onException` rollback conn
145+ r <- restore act `E.onException` rollback_ conn
146 commit conn
146 commit conn
@@ -167,7 +167,7 @@ withTransactionModeRetry mode shouldRetry conn act =
167 r <- act'
167 r <- act'
168 case r of
168 case r of
169 Left e -> do
169 Left e -> do
170− rollback conn
170+ rollback_ conn
171 case fmap shouldRetry (E.fromException e) of
171 case fmap shouldRetry (E.fromException e) of
172 Just True -> retryLoop act'
172 Just True -> retryLoop act'
173 _ -> E.throwIO e
173 _ -> E.throwIO e
@@ -178,6 +178,10 @@ withTransactionModeRetry mode shouldRetry conn act =
178rollback :: Connection -> IO ()
178rollback :: Connection -> IO ()
179rollback conn = execute_ conn "ABORT" >> return ()
179rollback conn = execute_ conn "ABORT" >> return ()
181+-- | Rollback a transaction, ignoring any @IOErrors@
182+rollback_ :: Connection -> IO ()
183+rollback_ conn = rollback conn `E.catch` \(_ :: IOError) -> return ()
181-- | Commit a transaction.
185-- | Commit a transaction.
182commit :: Connection -> IO ()
186commit :: Connection -> IO ()
183commit conn = execute_ conn "COMMIT" >> return ()
187commit conn = execute_ conn "COMMIT" >> return ()