diff --git a/Database/Redis/Monad.hs b/Database/Redis/Monad.hs
--- a/Database/Redis/Monad.hs
+++ b/Database/Redis/Monad.hs
@@ -151,7 +151,8 @@
                      bracket (liftIO $ Internal.takeState r)
                              (\_ -> liftIO $ Internal.putStateUnmodified r)
                              (\rs -> do liftIO $ (Internal.sendCommand rs (Internal.CInline "MULTI") >> (Internal.recv rs :: IO (Internal.Reply ())))
-                                        sequence_ cs'
+                                        sequence_ cs' `onException` (liftIO $ do Internal.sendCommand rs (Internal.CInline "DISCARD")
+                                                                                 Internal.recv rs :: IO (Internal.Reply ()))
                                         liftIO $ Internal.sendCommand rs (Internal.CInline "EXEC")
                                         liftIO $ Internal.recv rs)
 
@@ -169,7 +170,10 @@
                                 (\rs -> do liftIO $ (Internal.sendCommand rs (Internal.CMBulk ("WATCH" : keys')))
                                                       >> (Internal.recv rs :: IO (Internal.Reply ()))
                                                       >>= R.fromROk
-                                           res <- cs
+                                           res <- cs `onException` (liftIO $ do Internal.sendCommand rs (Internal.CInline "DISCARD")
+                                                                                Internal.recv rs :: IO (Internal.Reply ())
+                                                                                Internal.sendCommand rs (Internal.CInline "UNWATCH")
+                                                                                Internal.recv rs :: IO (Internal.Reply ()))
                                            liftIO $ (Internal.sendCommand rs (Internal.CInline "UNWATCH"))
                                                       >> (Internal.recv rs :: IO (Internal.Reply ()))
                                                       >>= R.fromROk
diff --git a/Database/Redis/Redis.hs b/Database/Redis/Redis.hs
--- a/Database/Redis/Redis.hs
+++ b/Database/Redis/Redis.hs
@@ -326,6 +326,7 @@
                     in withState r (\rs -> do sendCommand rs (CMBulk ("WATCH" : keys'))
                                               (recv rs :: IO (Reply ())) >>= fromROk
                                               res <- cs `onException` do sendCommand rs (CInline "DISCARD")
+                                                                         recv rs :: IO (Reply ())
                                                                          sendCommand rs (CInline "UNWATCH")
                                                                          recv rs :: IO (Reply ())
                                               sendCommand rs (CInline "UNWATCH")
diff --git a/redis.cabal b/redis.cabal
--- a/redis.cabal
+++ b/redis.cabal
@@ -1,5 +1,5 @@
 Name:                redis
-Version:             0.8
+Version:             0.8.1
 License:             MIT
 Maintainer:          Alexander Bogdanov <andorn@gmail.com>
 Author:              Alexander Bogdanov <andorn@gmail.com>
@@ -23,6 +23,8 @@
 	- zrangebyscore now supports LIMIT argument. Warning! Backward incompatible change!
 	.
 	- fixed behaviour of sort with multiple GET keys
+	.
+	- exceptions handled in run_multi and run_cas blocks leads to abort transaction explicitly
 	.
 
 Stability:           beta
