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

发布于 2022-01-02 22:45:47 字数 1402 浏览 906 评论 3

运行环境: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();
    }

测试结果

 

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

 

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

命硬 2022-01-06 15:31:10

spring-data-jpa在1.5的版本中没有该方法。只需要在配置template时开启对事务的支持即可。template.setEnableTransactionSupport(true);

羁拥 2022-01-05 08:57:07

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

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

if (redisTemplate.opsForValue().setIfAbsent("px1","wxb1",100, TimeUnit.SECONDS)) {
  //执行成功的逻辑
}
辞别 2022-01-04 14:07:40
template.setEnableTransactionSupport(true);

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文