@@ -507,14 +507,21 @@ ellipsis bs
507507-- for more information.
508508
509509data IsolationLevel
510− = DefaultIsolationLevel
510+ = DefaultIsolationLevel -- ^ the isolation level will be taken from
511+ -- PostgreSQL's per-connection
512+ -- @default_transaction_isolation@ variable.
511513 | ReadCommitted
512514 | RepeatableRead
513− | Serializable
515+ | Serializable -- ^ Note that prior to PostgreSQL 9.0,
516+ -- @Serializable@ was equivalent to
517+ -- @RepeatableRead@.
514518 deriving (Show, Eq, Ord, Enum, Bounded)
515519
516520data ReadWriteMode
517− = ReadWrite
521+ = DefaultReadWriteMode -- ^ the isolation level will be taken from the
522+ -- PostgreSQL's per-connection
523+ -- @default_transaction_read_only@ variable.
524+ | ReadWrite
518525 | ReadOnly
519526 deriving (Show, Eq, Ord, Enum, Bounded)
520527
@@ -524,13 +531,15 @@ data TransactionMode = TransactionMode {
524531 } deriving (Show, Eq)
525532
526533defaultTransactionMode :: TransactionMode
527−defaultTransactionMode = TransactionMode DefaultIsolationLevel ReadWrite
534+defaultTransactionMode = TransactionMode
535+ defaultIsolationLevel
536+ defaultReadWriteMode
528537
529538defaultIsolationLevel :: IsolationLevel
530539defaultIsolationLevel = DefaultIsolationLevel
531540
532541defaultReadWriteMode :: ReadWriteMode
533−defaultReadWriteMode = ReadWrite
542+defaultReadWriteMode = DefaultReadWriteMode
534543
535544-- | Execute an action inside a SQL transaction.
536545--
@@ -578,25 +587,18 @@ beginLevel lvl = beginMode defaultTransactionMode { isolationLevel = lvl }
578587-- | Begin a transaction with a given transaction mode
579588beginMode :: TransactionMode -> Connection -> IO ()
580589beginMode mode conn = do
581− _ <- execute_ conn $!
582− case mode of
583− TransactionMode DefaultIsolationLevel ReadWrite ->
584− "BEGIN"
585− TransactionMode DefaultIsolationLevel ReadOnly ->
586− "BEGIN READ ONLY"
587− TransactionMode ReadCommitted ReadWrite ->
588− "BEGIN ISOLATION LEVEL READ COMMITTED"
589− TransactionMode ReadCommitted ReadOnly ->
590− "BEGIN ISOLATION LEVEL READ COMMITTED READ ONLY"
591− TransactionMode RepeatableRead ReadWrite ->
592− "BEGIN ISOLATION LEVEL REPEATABLE READ"
593− TransactionMode RepeatableRead ReadOnly ->
594− "BEGIN ISOLATION LEVEL REPEATABLE READ READ ONLY"
595− TransactionMode Serializable ReadWrite ->
596− "BEGIN ISOLATION LEVEL SERIALIZABLE"
597− TransactionMode Serializable ReadOnly ->
598− "BEGIN ISOLATION LEVEL SERIALIZABLE READ ONLY"
599− return ()
590+ _ <- execute_ conn $! Query (B.concat ["BEGIN", isolevel, readmode])
591+ return ()
592+ where
593+ isolevel = case isolationLevel mode of
594+ DefaultIsolationLevel -> ""
595+ ReadCommitted -> " READ COMMITTED"
596+ RepeatableRead -> " REPEATABLE READ"
597+ Serializable -> " SERIALIZABLE"
598+ readmode = case readWriteMode mode of
599+ DefaultReadWriteMode -> ""
600+ ReadWrite -> " READ WRITE"
601+ ReadOnly -> " READ ONLY"
600602
601603fmtError :: String -> Query -> [Action] -> a
602604fmtError msg q xs = throw FormatError {