diff --git a/hasql-transaction.cabal b/hasql-transaction.cabal
--- a/hasql-transaction.cabal
+++ b/hasql-transaction.cabal
@@ -1,5 +1,5 @@
 name: hasql-transaction
-version: 0.9.1
+version: 0.10
 category: Hasql, Database, PostgreSQL
 synopsis: Composable abstraction over retryable transactions for Hasql
 homepage: https://github.com/nikita-volkov/hasql-transaction
diff --git a/library/Hasql/Transaction.hs b/library/Hasql/Transaction.hs
--- a/library/Hasql/Transaction.hs
+++ b/library/Hasql/Transaction.hs
@@ -78,9 +78,8 @@
   select (Transaction mode1 level1 list1) (Transaction mode2 level2 list2) =
     Transaction (max mode1 mode2) (max level1 level2) (select <$> list1 <*> list2)
 
-instance Alternative Transaction where
-  empty = Transaction minBound minBound []
-  (<|>) (Transaction mode1 level1 list1) (Transaction mode2 level2 list2) =
+instance Alt Transaction where
+  (<!>) (Transaction mode1 level1 list1) (Transaction mode2 level2 list2) =
     Transaction (max mode1 mode2) (max level1 level2) (list1 <> list2)
 
 {-|
diff --git a/library/Hasql/Transaction/Sessions.hs b/library/Hasql/Transaction/Sessions.hs
--- a/library/Hasql/Transaction/Sessions.hs
+++ b/library/Hasql/Transaction/Sessions.hs
@@ -14,34 +14,15 @@
 import qualified Hasql.Transaction.Statements as Statements
 
 
-inRetryingTransaction :: Mode -> Level -> Session (a, Condemnation) -> Session a
-inRetryingTransaction mode isolation session =
-  fix $ \ recur -> catchError normal (onError recur)
-  where
-    normal =
-      do
-        statement () (Statements.beginTransaction mode isolation)
-        (result, condemnation) <- session
-        case condemnation of
-          Uncondemned -> statement () Statements.commitTransaction
-          Condemned -> statement () Statements.abortTransaction
-        return result
-    onError continue error =
-      do
-        statement () Statements.abortTransaction
-        case error of
-          QueryError _ _ (ResultError (ServerError "40001" _ _ _)) -> continue
-          _ -> throwError error
-
 inAlternatingTransaction :: Mode -> Level -> [Session (a, Condemnation)] -> Session a
-inAlternatingTransaction mode level sessions =
+inAlternatingTransaction mode level =
   let
     loop = \ case
       session : sessionsTail -> tryTransaction mode level session >>= \ case
         Just a -> return a
         Nothing -> loop sessionsTail
-      _ -> loop sessions
-    in loop sessions
+      _ -> error "Attempt to run no alternatives"
+    in loop
 
 tryTransaction :: Mode -> Level -> Session (a, Condemnation) -> Session (Maybe a)
 tryTransaction mode level session = do
