git.iko.soy/typeable/postgresql-simple
on master help sign in
Ignore IOError on transaction rollback
71b4080Leon P Smith
src/Database/PostgreSQL/Simple/Transaction.hs+7−3
@@ -1,4 +1,4 @@
1−{-# LANGUAGE RecordWildCards #-}
1+{-# LANGUAGE RecordWildCards, ScopedTypeVariables #-}
2
2
3------------------------------------------------------------------------------
3------------------------------------------------------------------------------
4-- |
4-- |
@@ -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
147 return r
147 return r
148
148
@@ -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 ()
180
180
181+-- | Rollback a transaction, ignoring any @IOErrors@
182+rollback_ :: Connection -> IO ()
183+rollback_ conn = rollback conn `E.catch` \(_ :: IOError) -> return ()
184+
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 ()