@@ -108,7 +108,7 @@ import Blaze.ByteString.Builder (Builder, fromByteString, toByteString)
108108import Blaze.ByteString.Builder.Char8 (fromChar)
109109import Control.Applicative ((<$>), pure)
110110import Control.Concurrent.MVar
111−import Control.Exception (Exception, bracket, onException, throw, throwIO, finally)
111+import Control.Exception (Exception, onException, throw, throwIO, finally)
112112import Control.Monad (foldM)
113113import Control.Monad.Fix (fix)
114114import Data.ByteString (ByteString)
@@ -119,6 +119,7 @@ import Data.List (intersperse)
119119import Data.Monoid (mappend, mconcat)
120120import Data.Typeable (Typeable)
121121import Database.PostgreSQL.Simple.BuiltinTypes (oid2builtin, builtin2typname)
122+import Database.PostgreSQL.Simple.Compat (mask)
122123import Database.PostgreSQL.Simple.Param (Action(..), inQuotes)
123124import Database.PostgreSQL.Simple.QueryParams (QueryParams(..))
124125import Database.PostgreSQL.Simple.Result (ResultError(..))
@@ -532,11 +533,12 @@ withTransactionLevel lvl
532533
533534-- | Execute an action inside a SQL transaction with a given transaction mode.
534535withTransactionMode :: TransactionMode -> Connection -> IO a -> IO a
535−withTransactionMode mode conn act = do
536− beginMode mode conn
537− r <- act `onException` rollback conn
538− commit conn
539− return r
536+withTransactionMode mode conn act =
537+ mask $ \restore -> do
538+ beginMode mode conn
539+ r <- restore act `onException` rollback conn
540+ commit conn
541+ return r
540542
541543-- | Rollback a transaction.
542544rollback :: Connection -> IO ()