spring data redis watch事务不执行问题

 1 package com.devpg.redis;
 2
 3 import org.junit.After;
 4 import org.junit.Assert;
 5 import org.junit.Test;
 6 import org.junit.runner.RunWith;
 7 import org.slf4j.Logger;
 8 import org.slf4j.LoggerFactory;
 9 import org.springframework.beans.factory.annotation.Autowired;
10 import org.springframework.dao.DataAccessException;
11 import org.springframework.data.redis.core.RedisOperations;
12 import org.springframework.data.redis.core.RedisTemplate;
13 import org.springframework.data.redis.core.SessionCallback;
14 import org.springframework.test.context.ContextConfiguration;
15 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
16
17 @RunWith(SpringJUnit4ClassRunner.class)
18 @ContextConfiguration(locations = { "/testContext.xml" })
19 public class TransactionTest {
20
21     Logger logger = LoggerFactory.getLogger(TransactionTest.class);
22
23     @Autowired
24     RedisTemplate<String, Integer> template;
25
26     private final String key = "tx-key";
27
28     @After
29     public void deleteCounter() {
30         template.delete(key);
31     }
32
33     @Test
34     public void useOptimisticLocking() {
35         final int valueSetInBetween = 23;
36         final int valueSetWithinSession = 42;
37
38         /*
39          * By default each template method call creates a new connection - so
40          * WATCH, MUTLI, EXEC, UNWATCH won‘t work because of the missing
41          * context. To make use of transaction support use SessionCallback which
42          * reuses the underlying connection.
43          */
44         template.execute(new SessionCallback<Void>() {
45
46             @Override
47             public Void execute(RedisOperations operations)
48                     throws DataAccessException {
49                 operations.watch(key);
50
51                 setKeyByOtherBySession(valueSetInBetween);
52
53                 operations.multi();
54                 operations.boundValueOps(key).set(valueSetWithinSession);
55                 operations.exec();
56
57                 return null;
58             }
59         });
60
61         int value = template.boundValueOps(key).get().intValue();
62         Assert.assertEquals(valueSetInBetween, value);
63     }
64
65     private final void setKeyByOtherBySession(int value) {
66         template.boundValueOps(key).set(value);
67     }
68 }

关键时刻还是得找谷歌:https://github.com/devpg/spring-data-redis-example/blob/master/src/test/java/com/devpg/redis/TransactionTest.java

主要是这一句

/*
         * By default each template method call creates a new connection - so
         * WATCH, MUTLI, EXEC, UNWATCH won‘t work because of the missing
         * context. To make use of transaction support use SessionCallback which
         * reuses the underlying connection.
         */
时间: 2024-09-30 16:36:55

spring data redis watch事务不执行问题的相关文章

Spring Data Redis学习

本文是从为知笔记上复制过来的,懒得调整格式了,为知笔记版本是带格式的.点这里 为知笔记版本 Spring Data Redis 学习 Version 1.8.4.Release 前言 1.新功能 1.1.Spring Data Redis 1.8 新特性 1.2.Spring Data Redis 1.7 新特性 1.3.Spring Data Redis 1.6 新特性 1.4.Spring Data Redis 1.5 新特性 介绍 2.为什么选择Spring Data Redis? 3.要

使用Spring Data Redis操作Redis(一)

Spring-Data-Redis项目(简称SDR)对Redis的Key-Value数据存储操作提供了更高层次的抽象,类似于Spring Framework对JDBC支持一样. 项目主页:http://projects.spring.io/spring-data-redis/ 项目文档:http://docs.spring.io/spring-data/redis/docs/1.5.0.RELEASE/reference/html/ 本文主要介绍Spring Data Redis的实际使用. 1

Spring Data Redis 让 NoSQL 快如闪电(2)

[编者按]本文作者为 Xinyu Liu,文章的第一部分重点概述了 Redis 方方面面的特性.在第二部分,将介绍详细的用例.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 把 Redis 当作数据库的用例 现在我们来看看在服务器端 Java 企业版系统中把 Redis 当作数据库的各种用法吧.无论用例的简繁,Redis 都能帮助用户优化性能.处理能力和延迟,让常规 Java 企业版技术栈望而却步. 1. 全局唯一增量计数器 我们先从一个相对简单的用例开始吧:一个增量计数器,可显示某网

Spring Data Redis—Pub/Sub(附Web项目源码)

一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE 命令接收信息的时候,我们称这个客户端为订阅者(subscriber). 为了解耦发布者(publisher)和订阅者(subscriber)之间的关系,Redis 使用了 channel (频道)作为两者的中介 —— 发布者将信息直接发布给 channel ,而 channel 负责将信息发送给适当

Spring Data Redis—Pub/Sub(附Web项目源码) (转)

一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE 命令接收信息的时候,我们称这个客户端为订阅者(subscriber). 为了解耦发布者(publisher)和订阅者(subscriber)之间的关系,Redis 使用了 channel (频道)作为两者的中介 —— 发布者将信息直接发布给 channel ,而 channel 负责将信息发送给适当

Spring Data Redis简介以及项目Demo,RedisTemplate和 Serializer详解

一.概念简介: Redis: Redis是一款开源的Key-Value数据库,运行在内存中,由ANSI C编写,详细的信息在Redis官网上面有,因为我自己通过google等各种渠道去学习Redis,走了不少弯路,所以总结一条我认为不错的学习路径给大家: 1.<The Little Redis Book> 是一本开源PDF,只有29页的英文文档,看完后对Redis的基本概念应该差不多熟悉了,剩下的可以去Redis官网熟悉相关的命令. 2.<Redis设计与实现> 如果想继续深入,推

spring mvc Spring Data Redis RedisTemplate [转]

一.概念简介: Redis: Redis是一款开源的Key-Value数据库,运行在内存中,由ANSI C编写,详细的信息在Redis官网上面有,因为我自己通过google等各种渠道去学习Redis,走了不少弯路,所以总结一条我认为不错的学习路径给大家: 1.<The Little Redis Book> 是一本开源PDF,只有29页的英文文档,看完后对Redis的基本概念应该差不多熟悉了,剩下的可以去Redis官网熟悉相关的命令. 2.<Redis设计与实现> 如果想继续深入,推

【原创】Spring Data Redis &lt;=2.0.3反序列化漏洞

Spring Data Redis隶属于Spring Data家族, 提供简单易用的方式来访问Redis缓存. Spring Data Redis在往Redis里面写数据的时候,默认会先对数据进行序列化,然后把序列化之后的字节码写入Redis:然后当Spring Data Redis从Redis里取数据的时候,会取出字节码进行反序列化操作,在反序列化的过程中没有对目标类进行校验和过滤,可导致远程任意代码执行. 攻击路径: 1.首先准备反序列化payload,参考ysoserial系列. 2.把生

Spring data redis的使用

Spring data redis的使用 一.Redis的安装和使用 Redis是用C语言开发的一个高性能键值对数据库,可用于数据缓存,主要用于处理大量数据的高访问负载. 下载地址:https://github.com/MicrosoftArchive/redis/releases 解压后:在当前地址栏输入cmd后,执行redis的启动命令:redis-server.exe redis.windows.conf 二.整合Redis 添加项目依赖 <!--redis依赖配置--> <dep