redis - 没有 MULTI 的 ERR EXEC - spring redis + jedis

标签 redis jedis spring-data-redis

我在使用 spring-data-redis 进行事务操作时遇到异常

RedisTemplate<String,Object> cartCache;

public void create(final Cartline cartline) {
  Object txResults = cartCache.execute(new SessionCallback<List>() {
    public List execute(RedisOperations operations) throws DataAccessException {
      String cartId = cartline.getMemberId();
      String cartlineId = cartline.getCartlineId();
      operations.multi();    
      ......           
      return operations.exec();
    }
  });
}

redis.clients.jedis.exceptions.JedisDataException: ERR EXEC without MULTI
    at redis.clients.jedis.Protocol.processError(Protocol.java:115)
    at redis.clients.jedis.Protocol.process(Protocol.java:133)
    at redis.clients.jedis.Protocol.read(Protocol.java:202)
    at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:285)
    at redis.clients.jedis.Connection.getRawObjectMultiBulkReply(Connection.java:230)
    at redis.clients.jedis.Connection.getObjectMultiBulkReply(Connection.java:236)
    at redis.clients.jedis.Transaction.exec(Transaction.java:38)
    at org.springframework.data.redis.connection.jedis.JedisConnection.exec(JedisConnection.java:738)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.springframework.data.redis.core.CloseSuppressingInvocationHandler.invoke(CloseSuppressingInvocationHandler.java:57)
    at com.sun.proxy.$Proxy512.exec(Unknown Source)
    at org.springframework.data.redis.core.RedisTemplate$3.doInRedis(RedisTemplate.java:593)
    at org.springframework.data.redis.core.RedisTemplate$3.doInRedis(RedisTemplate.java:591)
    at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:190)
    at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:152)
    at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:140)
    at org.springframework.data.redis.core.RedisTemplate.execRaw(RedisTemplate.java:591)
    at org.springframework.data.redis.core.RedisTemplate.exec(RedisTemplate.java:578)
    at com.znova.stone.cart.repository.impl.CartCacheImpl$1.execute(CartCacheImpl.java:51)
    at com.znova.stone.cart.repository.impl.CartCacheImpl$1.execute(CartCacheImpl.java:1)
    at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:217)

我读了这篇文章 ERR EXEC without MULTI - Jedis这表示带有 exec 的 multi,我也启用了 redisTemplate.setEnableTransactionSupport(true);,但错误仍然存​​在。

我删除了 multi-exec block 中的操作逻辑,我发现那里没有任何区别,异常发生事件与零操作 block 。

最佳答案

我遇到了同样的问题,并通过将 spring-data-redis 从 1.4.2.RELEASE 更新到 1.5.2.RELEASE 来修复它。

关于redis - 没有 MULTI 的 ERR EXEC - spring redis + jedis,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27699007/

相关文章:

redis - 带 Redis 的 Elasticache - 性能非常慢

kubernetes 中的 redis-ha 无法故障转移回 master

node.js - Node-redis 初始连接很长

php redis扩展整数溢出

java - JedisCluster : redis. clients.jedis.exceptions.JedisNoReachableClusterNodeException:集群中没有可访问的节点

redis - Spring Data 对 Redis BRPOPLPUSH 的支持

java - Spring 数据 Redis NoSuchBeanDefinitionException : No qualifying bean of type

python - 从 Python-RQ/Redis 中删除队列

redis - jedis 未释放连接/jedis 泄漏连接/jedis 连接池随时间耗尽

java - 在哪里可以关闭我的 Spring Boot 应用程序中的 Lettuce Redis 连接?