您的位置:首页 > 数据库 > Redis

Redis系列学习(三)之java api接入及事务 (补)

2017-08-20 16:54 267 查看
Redis系列学习(三)之java api接入及事务 (补)


一 引言

二 事务例子补充

三 watch命令

一、 引言

本篇为补充《Redis系列学习(三)之java api接入及事务》文章里事务的例子

二、 事务例子补充

没加事务

private void testTransaction(){
System.out.println("======================测试事务==========================");
jedis.set("sex", "man");
jedis.incr("sex");
jedis.set("hello", "world");
}


结果如下:



数据库查看:



先添加“sex=man”数据,然后调用”incr”命令做加1操作,由于值”man”不是整型,所以加1操作发生了运行时错误,抛错之后的命令不会继续执行,我们看到运行时发生的错误,但还是成功。

如果加上事务会怎样?上篇文章讲“运行时错误,即使发生的错误,已经修改的值并不会回滚,并且后面命令会继续执行”,下面验证一下。

private void testTransaction(){
System.out.println("======================测试事务==========================");
Transaction transaction = jedis.multi();
transaction.set("sex", "man");
transaction.incr("sex");
transaction.set("hello", "world");
transaction.exec();
}


IDE结果如下图:



中间“transaction.incr(“sex”);”命令返回了执行错误消息,但后面命令还是继续执行。

数据库如下图



虽然发生了运行时错误,但并没有报异常错误,而且发生错误的地方后面命令还继续执行。

运行时发生的错误,即使错误发生(redis接收并执行,并没有把它当作错误来处理),后面的命令也会继续执行。

三、 watch命令

WATCH命令可以监控一个或多个键,一旦其中有一个键被修改(或删除),之后的事务就不会执行。监控一直持续到EXEC命令(事务中的命令是在EXEC之后才执行的,所以在MULTI命令后可以修改WATCH监控的键值)

例子:

private void testTransaction(){
System.out.println("======================测试事务==========================");
jedis.watch("sex");
jedis.set("sex", "man2");
Transaction transaction = jed
c80f
is.multi();
transaction.set("country", "china");
transaction.set("sex", "female");
transaction.set("hello", "world");
List<Object> results = transaction.exec();
System.out.println(results.toString());
}


数据库结果如下图



例子里,原始数据是“sex=man”,代码里先使用watch监控sex字段,然后修改sex=man2,虽然在事务命令队列里再将set设置”female”,但结果sex=man2。由些我们可以知道由于在开启事务之前sex被修改了,导致之事务里的命令全部不会执行,这里强调“事务队列里命令全部不会执行
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐