使用 Jedis 时如何检测 watch/exec 失败?
How to detect watch/exec failure when using Jedis?
这是我尝试执行的操作顺序:
WATCH somekey
MULTI
...
SET somekey somevalue
EXEC
我通过 RedisTemplate
的 execute(SessionCallback)
方法(伪代码)执行此操作:
l = template.execute({
ops.watch("somekey");
ops.multi()
ops.opsForValue().set("somekey", "somevalue")
return ops.exec()
})
我的问题是,当使用 jedis 时,l
不是 null
而是一个空列表,因此执行失败与执行成功无法区分,因为 multi 中没有操作 return 结果。
这里的单元测试似乎证实了这一点:https://github.com/spring-projects/spring-data-redis/blob/1.8.4.RELEASE/src/test/java/org/springframework/data/redis/core/RedisTemplateTests.java#L740 测试失败的地方:
if (redisTemplate.getConnectionFactory() instanceof JedisConnectionFactory) {
assertThat(results, is(empty()));
} else {
assertNull(results);
}
与它下面的 testUnwatch
测试相比,测试 成功 取消监视后执行,并且还期望一个空列表 (results.isEmpty()
)。
使用Jedis时如何区分这两种情况?
TL;DR
您无法使用 Jedis 检测事务回滚。
说明
Jedis returns,在any case,当前可用版本(2.8.2、2.9.0)中的一个List
对象。此更改是代码清理的一部分,以防止 Jedis 在回滚 Redis 事务时在 exec(…)
上返回 null
。
现在,Jedis rolled back the change 但是 Jedis 已经有大约一年没有发布了。
如果检测事务回滚对您的要求至关重要,请尝试 different Redis client。
这是我尝试执行的操作顺序:
WATCH somekey
MULTI
...
SET somekey somevalue
EXEC
我通过 RedisTemplate
的 execute(SessionCallback)
方法(伪代码)执行此操作:
l = template.execute({
ops.watch("somekey");
ops.multi()
ops.opsForValue().set("somekey", "somevalue")
return ops.exec()
})
我的问题是,当使用 jedis 时,l
不是 null
而是一个空列表,因此执行失败与执行成功无法区分,因为 multi 中没有操作 return 结果。
这里的单元测试似乎证实了这一点:https://github.com/spring-projects/spring-data-redis/blob/1.8.4.RELEASE/src/test/java/org/springframework/data/redis/core/RedisTemplateTests.java#L740 测试失败的地方:
if (redisTemplate.getConnectionFactory() instanceof JedisConnectionFactory) {
assertThat(results, is(empty()));
} else {
assertNull(results);
}
与它下面的 testUnwatch
测试相比,测试 成功 取消监视后执行,并且还期望一个空列表 (results.isEmpty()
)。
使用Jedis时如何区分这两种情况?
TL;DR
您无法使用 Jedis 检测事务回滚。
说明
Jedis returns,在any case,当前可用版本(2.8.2、2.9.0)中的一个List
对象。此更改是代码清理的一部分,以防止 Jedis 在回滚 Redis 事务时在 exec(…)
上返回 null
。
现在,Jedis rolled back the change 但是 Jedis 已经有大约一年没有发布了。
如果检测事务回滚对您的要求至关重要,请尝试 different Redis client。