Skip to content

Commit 53a54cc

Browse files
committed
Don't call getConnectionAcquisitionMode within uninterruptibleMask
1 parent 1526842 commit 53a54cc

File tree

1 file changed

+10
-8
lines changed

1 file changed

+10
-8
lines changed

src/Database/PostgreSQL/PQTypes/Transaction.hs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,18 @@ withSavepoint (Savepoint savepoint) m = do
4747

4848
----------------------------------------
4949

50-
-- Note: below functions that modify transaction state need to not be
51-
-- interruptible so we don't end up in unexpected transaction state.
50+
-- Note: sql queries in below functions that modify transaction state need to
51+
-- not be interruptible so we don't end up in unexpected transaction
52+
-- state. However, getConnectionAcquisitionMode should be interruptible to not
53+
-- lead to deadlocks if a connection ends up being used from multiple threads.
5254

5355
-- | Begin transaction using given transaction settings.
5456
begin :: (HasCallStack, MonadDB m, MonadMask m) => m ()
55-
begin = uninterruptibleMask_ $ do
57+
begin = do
5658
getConnectionAcquisitionMode >>= \case
5759
AcquireOnDemand -> do
5860
throwDB $ HPQTypesError "Can't begin a transaction in OnDemand mode"
59-
AcquireAndHold isolationLevel permissions -> do
61+
AcquireAndHold isolationLevel permissions -> uninterruptibleMask_ $ do
6062
runSQL_ $
6163
smconcat
6264
[ "BEGIN"
@@ -73,21 +75,21 @@ begin = uninterruptibleMask_ $ do
7375

7476
-- | Commit active transaction using given transaction settings.
7577
commit :: (HasCallStack, MonadDB m, MonadMask m) => m ()
76-
commit = uninterruptibleMask_ $ do
78+
commit = do
7779
getConnectionAcquisitionMode >>= \case
7880
AcquireOnDemand -> do
7981
throwDB $ HPQTypesError "Can't commit a transaction in OnDemand mode"
80-
AcquireAndHold {} -> do
82+
AcquireAndHold {} -> uninterruptibleMask_ $ do
8183
runSQL_ "COMMIT"
8284
begin
8385

8486
-- | Rollback active transaction using given transaction settings.
8587
rollback :: (HasCallStack, MonadDB m, MonadMask m) => m ()
86-
rollback = uninterruptibleMask_ $ do
88+
rollback = do
8789
getConnectionAcquisitionMode >>= \case
8890
AcquireOnDemand -> do
8991
throwDB $ HPQTypesError "Can't rollback a transaction in OnDemand mode"
90-
AcquireAndHold {} -> do
92+
AcquireAndHold {} -> uninterruptibleMask_ $ do
9193
runSQL_ "ROLLBACK"
9294
begin
9395

0 commit comments

Comments
 (0)