redis事务java_java 使用RedisTemplate实现Redis事务

关系型数据库事务的作用是保证并发访问下数据的一致性,Redis事务有些不同,由于Redis是单线程的处理来自client的指令,所以Redis所有命令的执行都是原子性的,举一个简单的例子,单个Redis服务器下,并发地执行INCR命令,也不会返回相同的结果。

所以Redis事务的意义在于保证命令的批量顺序执行,并且事务执行期间,Redis不会执行来自client的其他请求。有一点需要注意的是,。如果有命令执行失败,还是会继续执行剩下的命令,因为Redis没有异常回滚。

对“Redis事务命令要么全部执行,要么全部不执行”这句事实的理解:如果有命令执行失败,并不是中断事务,而是继续执行剩下的指令,因为Redis不支持异常回滚。全部不执行的情况有 1.没有执行EXEC命令 2.WATCH的key发生改变 3.DISCARD命令放弃事务。本质上开启事务后,所有输入的命令都被缓存在一个队列中,一旦EXEC,队列里的指令被一条一条的执行。

关于事务的API

MULTI    开启事务

EXEC    执行任务队列里所有命令,并结束事务

DISCARD     放弃事务,清空任务队列,全部不执行,并UNWATCH

WATCH key [key1]    MULTI执行之前,指定监控某key,如果key发生修改,放弃整个事务执行

UNWATCH    手动取消监控

Spring Data Redis 事务问题

RedisTemplate来操作Redis,关于事务操作的时候会有问题:

redisTemplate.multi();

redisTemplate.opsForValue().increment("xxx",1);

redisTemplate.opsForValue().increment("ttt",1);

redisTemplate.exec();

调用会报一个错误“No ongoing transaction. Did you forget to call multi? ”查了下,RedisTemplate操作事务不能理所当然地像原生API那么写,其实RedisTemplate的事务需要自己实现一个SessionCallBack来做事务,所以要这么写

SessionCallback sessionCallback = newSessionCallback() {

@Overridepublic Object execute(RedisOperations redisOperations) throwsDataAccessException {

redisOperations.multi();//TODO: 2017/11/20 命令1//TODO: 2017/11/20 命令2//TODO: 2017/11/20 命令3

returnredisOperations.exec();

}

};

redisTemplate.execute(sessionCallback);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/559978.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java string值传递_String是值传递还是引用传递

string中的坑最近看到一道关于string的面试题,差点让我以为string是值传递,就是下面这个例子,体验下:public class demo{public static void main(string[] args) {demo d new demo();string str "bea";d.change(str)…

java切换jdk版本_切换JDK版本quick

最近遇到一个小问题,同时做两个项目,jdk版本一个是5,一个是6,我也去网上找了找方法,但是感觉不是特别好用,最后自己通过一些环境变量设置的技巧和一些批处理命令来使得这件事情只需要双击,输入一…

java读取excel数据的方法是_java怎么读取excel文件里的数据

展开全部下面是一个简单的读取例子,如果报“java.io.IOException: Invalid header signature; read 4503608217567241, expected -2226271756974174256”之类的异常请用Excel打开(如果能打的开的话)62616964757a686964616fe58685e5aeb931333361323639然后另存为一下…

Linux下导出MySQL为SQL文件_MySQL导入导出.sql文件步骤

MySQL导入导出.sql文件步骤如下:一.MySQL的命令行模式的设置:桌面->我的电脑->属性->环境变量->新建->PATH“;path\mysql\bin;”其中path为MySQL的安装路径。二.简单的介绍一下命令行进入MySQL的方法:1.C:\>mys…

python sort 多级排序_Python使用sort和class实现的多级排序功能示例

本文实例讲述了Python使用sort和class实现的多级排序功能。分享给大家供大家参考,具体如下:# -*- coding:utf-8 -*-import randomclass Temp:def __init__(self, a, b, c):self.a aself.b bself.c cdef __str__(self):return ( ([a: %d b: %d c: %d] …

the java home_the java_home environment variable is not defined correctly

在启动tomcat中的startup.bat时,总是报以下错误the java_home environment variable is not defined correctlyThis environment variable is needed to run this programNB: java_home should point to a jdk not a jre环境变量的路径没有问题,把jdk重装…

java中添加背景_java中如何增加背景图片

我的程序代码如下,试了加背景的方法虽然程序没有错误,但是背景还是显示不出来,按钮的setsize好像也不起作用,希望高人能助一臂之力,小女子先写过各位了:、、、、importjava.awt....我的程序代码如下&#x…

java存钱_用Java编写银行存钱取钱

const readline require(readline-sync)//引用readline-synclet s 2;//错误的次数for (let i 0; i < 3; i) {console.log(请输入名&#xff1a;(由英文组成));let user readline.question();console.log(请输入密码&#xff1a;(由数字组成));let password readline.qu…

我的世界java服务器刷_一个教程, 叫你如何在服务器刷op

教 你 如 何 在 服 务 器 内 刷 取op~&#xff01;首先打开JAVA文件夹找到bin\client 里面的Xusage然后打开然后会得到这个内容-Xmixed mixed mode execution (default)-Xint interpreted mode execution only-Xbootclasspath:set search path for boots…

mysql 小雨_Mysql数据库

Mysql服务配置安装mysqld服务&#xff1a;yum groupinstall ‘mysql database server’yum –y install mysql-server php-mysql服务名&#xff1a; mysqld默认的数据库存放在&#xff1a; /var/lib/mysql下启动服务&#xff1a; service mysqld restart可以直接登陆&#xff1…

java eav_动态自定义字段属性–Magento的EAV模型 | 学步园

EAV &#xff1a; Entity - Attribute - Value 的缩写&#xff0c;是数据库模型的一种&#xff0c;使用eav建模的好处是可以动态为数据模型增加或移除属性。1. 问题提出:假设需要定义一个实体Customer的信息&#xff0c;通常我们只要定义一个表为customer&#xff0c;并定义相应…

java 对象视图框架_Stripes视图框架Java对象属性验证和prototype.js Ajax的测试

Stripes视图框架Java对象属性验证&#xff0c;它允许对字段设置是否必须填写&#xff0c;对数字大小进行限制等。我用prototype.js Ajax 将验证后的数据及时地展示出来&#xff0c;下面来看程序。1、编写User实体类此用户共三个属性&#xff1a; name、email、age.package com.…

java中unicode显示乱码_Java 已知Java系统编码是GBK,jtextarea从一编码为Unicode的文本中读取数据,出现乱码,怎么正常显示?...

Java 已知Java系统编码是GBK&#xff0c;jtextarea从一编码为Unicode的文本中读取数据&#xff0c;出现乱码&#xff0c;怎么正常显示&#xff1f;关注:159 答案:2 mip版解决时间 2021-02-03 12:45提问者鉨瞞着所囿亾&#xff0c;爱着誰2021-02-02 16:35我觉得jtextarea中读取…

java中按钮的接口_Java接口基础

接口(interface)1.接口体中包含常量的声明(没有变量)和抽象方法两部分。接口体中只有抽象方法&#xff0c;没有普通的方法&#xff0c;而且接口体中所有的常量访问权限一定是public&#xff0c;而且是static常量(允许省略public、final和static修饰符)&#xff0c;所有的抽象方…

python之if经典语句_Python之if语句、字典

if语句1>利用if语句判断用户是否被禁言banned_users.pybanned_users[Lily,jonh,Susan]userLilyif user not in baned_users:print(user.title()",you can post a response if you wish.")######2>if else 语句age17if age>18:print("You are old enoug…

java 线程加载类_java JVM-线程上下类加载器

public class One {public static void main(String[] args) throws Exception {ClassLoader loaderOne.class.getClassLoader();System.out.println(loader);//获得当前线程的上下文加载器&#xff0c;未改变前和第一种是一样的ClassLoader loader2Thread.currentThread().get…

catalog move.php,catalog.php

/*** WK 列出所有分类及品牌* * * 版权所有 2005-2012 QQ 80342014&#xff0c;并保留所有权利。* &#xff1b;* ----------------------------------------------------------------------------* 这不是一个自由软件&#xff01;您只能在不用于商业目的的前提下对程序代码进…

php get 数据类型,PHP基础-数据类型-integet

integer 是集合 ℤ {…, -2, -1, 0, 1, 2, …} 中的某个数。语法整型值可以使用十进制&#xff0c;十六进制&#xff0c;八进制或二进制表示&#xff0c;前面可以加上可选的符号(- 或者 )。 可以用 负运算符 来表示一个负的integer。二进制表达的 integer 自 PHP 5.4.0 起可用…

php怎么seo,怎样学习seo

学习seo的方法&#xff1a;1、从搜索引擎原理开始&#xff0c;学习seo要先从搜索引擎原理开始&#xff1b;2、多思考&#xff1b;3、学习seo要多看高质量的seo教程&#xff1b;4、多和seo高手交流&#xff0c;经常听听大神的seo理论&#xff0c;集百家之所长&#xff0c;这样会…

php callable 参数,php 利用反射执行callable

现在有一个这样的函数我想利用反射&#xff0c;再用call_user_func执行&#xff0c;当然&#xff0c;我不是白痴和多此一举&#xff0c;主要是因为上面的$func是一个数组中的值&#xff0c;我现在要写一个解析数据函数&#xff0c;会遇到$func&#xff0c;写法如下&#xff1a;…