diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,7 @@
+## 2.2.4
+
+* Workaround for side-exiting transformers in `runSqlConn` [#516](https://github.com/yesodweb/persistent/issues/516)
+
 ## 2.2.3
 
 * PersistField instance for Natural
diff --git a/Database/Persist/Sql/Run.hs b/Database/Persist/Sql/Run.hs
--- a/Database/Persist/Sql/Run.hs
+++ b/Database/Persist/Sql/Run.hs
@@ -50,13 +50,13 @@
 {-# INLINABLE withResourceTimeout #-}
 
 runSqlConn :: MonadBaseControl IO m => SqlPersistT m a -> SqlBackend -> m a
-runSqlConn r conn = do
+runSqlConn r conn = control $ \runInIO -> mask $ \restore -> do
     let getter = getStmtConn conn
-    liftBase $ connBegin conn getter
+    restore $ connBegin conn getter
     x <- onException
-            (runReaderT r conn)
-            (liftBase $ connRollback conn getter)
-    liftBase $ connCommit conn getter
+            (restore $ runInIO $ runReaderT r conn)
+            (restore $ connRollback conn getter)
+    restore $ connCommit conn getter
     return x
 
 runSqlPersistM :: SqlPersistM a -> SqlBackend -> IO a
diff --git a/persistent.cabal b/persistent.cabal
--- a/persistent.cabal
+++ b/persistent.cabal
@@ -1,5 +1,5 @@
 name:            persistent
-version:         2.2.3
+version:         2.2.4
 license:         MIT
 license-file:    LICENSE
 author:          Michael Snoyman <michael@snoyman.com>
