ERR EXEC без MULTI - Джедаи

Я изучаю jedis, я не мог точно выяснить, в чем проблема в этом коде. Может ли кто-нибудь мне помочь. Исключение возникает в операторе tx.exec ()

public class JedisFactory {

 public static void main (String [] args){
     JedisPool pool = new JedisPool(new JedisPoolConfig(), "127.0.0.1", 6379);
     Jedis jedis = pool.getResource();

     Pipeline pipeline = jedis.pipelined();
     for(int i=0; i < 1000 ; i++){
         pipeline.hincrBy("Id", i+"", i);
     }
     pipeline.exec();        
     pool.returnResource(jedis);

     jedis = pool.getResource();
     Transaction tx = jedis.multi();
     Response<Map<String,String>> map = tx.hgetAll("Id");
     tx.hincrBy("Id","2", 1);
     **tx.exec();**
     //Map<String,String> map1 = jedis.hgetAll("Id");

     pool.returnResource(jedis);
     pool.destroy();
 }
}
Exception in thread "main" redis.clients.jedis.exceptions.JedisDataException: ERR EXEC without MULTI
    at redis.clients.jedis.Protocol.processError(Protocol.java:54)
    at redis.clients.jedis.Protocol.process(Protocol.java:61)
    at redis.clients.jedis.Protocol.read(Protocol.java:122)
    at redis.clients.jedis.Connection.getAll(Connection.java:207)
    at redis.clients.jedis.BinaryTransaction.exec(BinaryTransaction.java:23)
    at com.work.JedisFactory.main(JedisFactory.java:30)

person user1182253    schedule 18.04.2013    source источник


Ответы (3)


Вы должны окружить pipeline.exec(); методами multi() и close(). Как это:

pipeline.multi() ;
pipeline.exec();
pipeline.close(); 
person Shedom Wei    schedule 05.12.2019

Добавление pipe.multi() перед циклом for решило проблему. Но исключение возникло в какой-то другой строке перед исправлением.

person user1182253    schedule 18.04.2013

Я думаю, вам следует использовать pipe.execute() вместо pipe.exec(), по крайней мере, я использовал его так, и все было в порядке.

person Tommaso Barbugli    schedule 18.04.2013
comment
В Pipeline нет метода с именем execute() - Jedis 2.1.0 - person user1182253; 19.04.2013