SpringBoot开启Redis事务错误: Cannot use Jedis when in Multi. Please use Transaction or reset jedis state.

文章目录

  • 一、问题描述
  • 二、问题原因

一、问题描述

  1. SpringBoot使用Jedis作为客户端,用RedisTemplate操作事务时返回报错

    public Object execTransactionIncorrect() {

    1. // watch该key,如果提交事物时有外界调整则设置失败
    2. String key = "redis";
    3. stringRedisTemplate.watch(key);
    4. stringRedisTemplate.opsForValue().set(key, "100");
    5. try {
    6. // 开启事务
    7. stringRedisTemplate.multi();
    8. // 修改数据
    9. stringRedisTemplate.opsForValue().increment(key);
    10. // 提交事物
    11. stringRedisTemplate.exec();
    12. } catch (Exception e) {
    13. e.printStackTrace();
    14. }
    15. return stringRedisTemplate.opsForValue().get(key);

    }

  2. 运行之后提示

在这里插入图片描述

  1. JedisDataException: Cannot use Jedis when in Multi. Please use Transaction or reset jedis state.

二、问题原因

  1. redisTemplate中需要通过execute来执行,在execute中才能使用事务
  2. 正确使用示例

    public Object execTransactionCorrect() {

    1. // watch该key,如果提交事物时有外界调整则设置失败
    2. String key = "redis";
    3. stringRedisTemplate.opsForValue().set(key, "100");
    4. return stringRedisTemplate.execute(new SessionCallback<String>() {
    5. @Override
    6. public <K, V> String execute(RedisOperations<K, V> operations) throws DataAccessException {
    7. try {
    8. operations.watch((K) key);
    9. // 开启事务
    10. operations.multi();
    11. // 修改数据
    12. operations.opsForValue().increment((K) key);
    13. // 模拟异常
    14. // Integer.parseInt("a");
    15. // 提交事物
    16. operations.exec();
    17. } catch (Exception e) {
    18. e.printStackTrace();
    19. }
    20. return (String) operations.opsForValue().get(key);
    21. }
    22. });

    }

  3. 重新运行,执行正常

发表评论

表情:
评论列表 (有 0 条评论,86人围观)

还没有评论,来说两句吧...

相关阅读