SpringBoot开启Redis事务错误: Cannot use Jedis when in Multi. Please use Transaction or reset jedis state.
文章目录
- 一、问题描述
- 二、问题原因
一、问题描述
SpringBoot使用Jedis作为客户端,用RedisTemplate操作事务时返回报错
public Object execTransactionIncorrect() {
// watch该key,如果提交事物时有外界调整则设置失败
String key = "redis";
stringRedisTemplate.watch(key);
stringRedisTemplate.opsForValue().set(key, "100");
try {
// 开启事务
stringRedisTemplate.multi();
// 修改数据
stringRedisTemplate.opsForValue().increment(key);
// 提交事物
stringRedisTemplate.exec();
} catch (Exception e) {
e.printStackTrace();
}
return stringRedisTemplate.opsForValue().get(key);
}
运行之后提示
JedisDataException: Cannot use Jedis when in Multi. Please use Transaction or reset jedis state.
二、问题原因
- redisTemplate中需要通过execute来执行,在execute中才能使用事务
正确使用示例
public Object execTransactionCorrect() {
// watch该key,如果提交事物时有外界调整则设置失败
String key = "redis";
stringRedisTemplate.opsForValue().set(key, "100");
return stringRedisTemplate.execute(new SessionCallback<String>() {
@Override
public <K, V> String execute(RedisOperations<K, V> operations) throws DataAccessException {
try {
operations.watch((K) key);
// 开启事务
operations.multi();
// 修改数据
operations.opsForValue().increment((K) key);
// 模拟异常
// Integer.parseInt("a");
// 提交事物
operations.exec();
} catch (Exception e) {
e.printStackTrace();
}
return (String) operations.opsForValue().get(key);
}
});
}
重新运行,执行正常
还没有评论,来说两句吧...