Merge pull request #51 from coyotesqrl/master

Issue with masked errors is withTransaction()
diff --git a/src/groovy/grails/plugin/redis/RedisService.groovy b/src/groovy/grails/plugin/redis/RedisService.groovy
index 0a57401..b8ab9de 100644
--- a/src/groovy/grails/plugin/redis/RedisService.groovy
+++ b/src/groovy/grails/plugin/redis/RedisService.groovy
@@ -67,11 +67,12 @@
             Transaction transaction = redis.multi()
             try {
                 closure(transaction)
-                transaction.exec()
             } catch(Exception exception) {
                 transaction.discard()
                 throw exception
             }
+
+            transaction.exec()
         }
     }
 
diff --git a/test/integration/grails/plugin/redis/RedisServiceTests.groovy b/test/integration/grails/plugin/redis/RedisServiceTests.groovy
index c88bce8..8f8fe78 100644
--- a/test/integration/grails/plugin/redis/RedisServiceTests.groovy
+++ b/test/integration/grails/plugin/redis/RedisServiceTests.groovy
@@ -6,6 +6,7 @@
 import org.junit.Before
 import org.junit.Test
 import redis.clients.jedis.exceptions.JedisConnectionException
+import redis.clients.jedis.exceptions.JedisDataException
 
 import static grails.plugin.redis.RedisService.NO_EXPIRATION_TTL
 import redis.clients.jedis.Jedis
@@ -525,6 +526,29 @@
         assert "bar" == redisService.foo
     }
 
+    @Test
+    public void testWithTransactionEmptyMapException() {
+        redisService.withRedis { Jedis redis ->
+            assert redis.get("foo") == null
+        }
+
+        shouldFail(JedisDataException) {
+            try {
+                redisService.withTransaction { Transaction transaction ->
+                    def emptyMap = [:]
+                    transaction.hmset("foo", emptyMap)
+                }
+            } catch (any) {
+                assert any.message.startsWith("EXECABORT")
+                throw any
+            }
+        }
+
+        redisService.withRedis { Jedis redis ->
+            assert redis.get("foo") == null
+        }
+    }
+
     def testMethodNotOnJedisThrowsMethodMissingException() {
         def result = shouldFail { redisService.methodThatDoesNotExistAndNeverWill() }