利用spring-data-redis实现redis事务效果

彭星浪 发布于 2020/03/04 13:38
阅读 373
收藏 0

软件工程师和算法工程师速来!正在直播:如何使用英特尔oneAPI工具实现PyTorch 优化>>>

运行环境:spring-boot-starter-data-redis 1.5.10RELEASE,jedis:2.9

其他配置,启动器器已经添加@EnableTransactionManagement注解

//配置类
@Configuration
public class RedisConfig  {


    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
        RedisTemplate<String,Object> template = new RedisTemplate<String, Object>();
        template.setConnectionFactory(factory);
        template.setKeySerializer(new StringRedisSerializer());
       //实例化字符串
        template.setValueSerializer(new StringRedisSerializer());
        return template;
    }


}

测试代码

@Autowired
    private RedisTemplate redisTemplate;

    @Test
    @Transactional(rollbackFor = Exception.class)
    public void test() {
        redisTemplate.multi();
        redisTemplate.opsForValue().setIfAbsent("pxl","wxb1");
        redisTemplate.expire("pxl",100, TimeUnit.SECONDS);
        redisTemplate.discard();

        //redisTemplate.exec();
    }

测试结果

 

问题:出现该情况的原因到底是什么????

 

加载中
0
彭星浪
template.setEnableTransactionSupport(true);

配置中开启对事务的支持,redis默认单机支持事务,集群不支持

0
chentao106
chentao106

Redis没有事务的概念,而且你的RedisTemplate对象bean是全局共享的,不可能通过顺序调用来保障事务性。想要原子执行多条命令,需要调用executePiplined并在回调中传入命令。

你上面的命令可以直接合并成一句:

if (redisTemplate.opsForValue().setIfAbsent("px1","wxb1",100, TimeUnit.SECONDS)) {
  //执行成功的逻辑
}
彭星浪
spring-data-jpa在1.5的版本中没有该方法。只需要在配置template时开启对事务的支持即可。template.setEnableTransactionSupport(true);
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部
返回顶部
顶部