/**
* 其实redis的事务本身就是一组命令集合,multi用来标记事务开始,
* exec用来执行之间的命令,由于贴有@Transactional标签加上templete的事务设置,
* 框架会自动去帮我们开启和执行事务,所以,一开始isMulti就是ture,当我们get的时候,
* 此时并不会立即执行这条命令,而是等框架给我们exec的时候去真正执行返回结果,
* 那么立即返回了个null,所以使用了@Transactional和redisTemplate.setEnableTransactionSupport(true)在本方法中不能使用get去取值或者去watch,
* 也不要去mutli和exec了,正常执行set就行了。
* @param timeout
* @param machines
*/
@Override
public void refreshMachines(long timeout, long... machines) {
try {
System.out.println("事物开启,检查是否异常 add heruixing !!!");
stringRedisTemplate.setEnableTransactionSupport(true);
// stringRedisTemplate.multi();
for (long mac : machines) {
stringRedisTemplate.opsForValue().set(REDIS_MACHINE_ID_MAP_PREFIX + mac, "", timeout, TimeUnit.MILLISECONDS);
}
// stringRedisTemplate.exec();
} catch (Throwable e) {
e.printStackTrace();
// stringRedisTemplate.discard();
} finally {
stringRedisTemplate.setEnableTransactionSupport(false);
System.out.println("事物结束,检查是否异常 add heruixing !!!");
}
}