@@ -507,14 +507,21 @@ ellipsis bs
507-- for more information.
507-- for more information.
509data IsolationLevel
509data IsolationLevel
510− = DefaultIsolationLevel
510+ = DefaultIsolationLevel -- ^ the isolation level will be taken from
511+ -- PostgreSQL's per-connection
512+ -- @default_transaction_isolation@ variable.
511 | ReadCommitted
513 | ReadCommitted
512 | RepeatableRead
514 | RepeatableRead
513− | Serializable
515+ | Serializable -- ^ Note that prior to PostgreSQL 9.0,
516+ -- @Serializable@ was equivalent to
517+ -- @RepeatableRead@.
514 deriving (Show, Eq, Ord, Enum, Bounded)
518 deriving (Show, Eq, Ord, Enum, Bounded)
516data ReadWriteMode
520data ReadWriteMode
521+ = DefaultReadWriteMode -- ^ the isolation level will be taken from the
522+ -- PostgreSQL's per-connection
523+ -- @default_transaction_read_only@ variable.
517− = ReadWrite
524+ | ReadWrite
518 | ReadOnly
525 | ReadOnly
519 deriving (Show, Eq, Ord, Enum, Bounded)
526 deriving (Show, Eq, Ord, Enum, Bounded)
@@ -524,13 +531,15 @@ data TransactionMode = TransactionMode {
524 } deriving (Show, Eq)
531 } deriving (Show, Eq)
526defaultTransactionMode :: TransactionMode
533defaultTransactionMode :: TransactionMode
527−defaultTransactionMode = TransactionMode DefaultIsolationLevel ReadWrite
534+defaultTransactionMode = TransactionMode
535+ defaultIsolationLevel
536+ defaultReadWriteMode
529defaultIsolationLevel :: IsolationLevel
538defaultIsolationLevel :: IsolationLevel
530defaultIsolationLevel = DefaultIsolationLevel
539defaultIsolationLevel = DefaultIsolationLevel
532defaultReadWriteMode :: ReadWriteMode
541defaultReadWriteMode :: ReadWriteMode
533−defaultReadWriteMode = ReadWrite
542+defaultReadWriteMode = DefaultReadWriteMode
535-- | Execute an action inside a SQL transaction.
544-- | Execute an action inside a SQL transaction.
@@ -578,25 +587,18 @@ beginLevel lvl = beginMode defaultTransactionMode { isolationLevel = lvl }
578-- | Begin a transaction with a given transaction mode
587-- | Begin a transaction with a given transaction mode
579beginMode :: TransactionMode -> Connection -> IO ()
588beginMode :: TransactionMode -> Connection -> IO ()
580beginMode mode conn = do
589beginMode mode conn = do
581− _ <- execute_ conn $!
590+ _ <- execute_ conn $! Query (B.concat ["BEGIN", isolevel, readmode])
583− TransactionMode DefaultIsolationLevel ReadWrite ->
585− TransactionMode DefaultIsolationLevel ReadOnly ->
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 ()
591+ return ()
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"
601fmtError :: String -> Query -> [Action] -> a
603fmtError :: String -> Query -> [Action] -> a
602fmtError msg q xs = throw FormatError {
604fmtError msg q xs = throw FormatError {