使用spring数据redis实现的悲观锁定,setNX方法返回null

时间:2015-09-02 22:56:28

标签: spring redis

将spring-data-redis从1.4.2升级到1.5.2后,会出现此错误。

我的代码是实现悲观锁定,

redisTemplate.execute(new RedisCallback<Boolean>() {
                @Override
                public Boolean doInRedis(RedisConnection connection)
                        throws DataAccessException {
Boolean nx = connection.setNX(lockKey.getBytes(), identifier.getBytes());
return nx;
}};

检查所有字段不为空。 setNx方法始终返回null。它应该返回布尔值true或false。

感谢任何帮助。

更新

上面的代码段嵌套在另一个SessionCallback Redis事务中。它曾经在spring-data-redis 1.4.2下工作。为了修复ERR EXEC without MULTI - spring redis+jedis报告的“没有MULTI的ERR EXEC”,我将lib升级到1.5.2,问题突然出现了。

为了解决这个问题,我首先尝试为嵌套的回调方法分配一个不同的redisTemplate(原型bean),但它没有用。 工作解决方案是将单个事务分解并展平为4,“测试是否需要锁定”,“获取锁定”,“执行业务”,“释放锁定”。

1 个答案:

答案 0 :(得分:0)

看来问题是由嵌套Redis事务引起的。即使使用不同的redisTemplate(不同的数据库连接)嵌套SessionCallback也无法嵌套事务。工作解决方案是扁平化为4个交易,&#34;测试是否需要锁定&#34;,&#34;获取锁定&#34;,&#34;做生意&#34;,&#34;释放锁定& #34 ;.