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

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

  • 一 引言
  • 二 事务例子补充
  • 三 watch命令

一、 引言

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

二、 事务例子补充

没加事务

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

结果如下:
Redis系列学习(三)之java api接入及事务 (补)_第1张图片
数据库查看:
这里写图片描述
先添加“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 = jedis.multi();
        transaction.set("country", "china");
        transaction.set("sex", "female");
        transaction.set("hello", "world");
        List results = transaction.exec();
        System.out.println(results.toString());
    } 
  

数据库结果如下图
这里写图片描述
例子里,原始数据是“sex=man”,代码里先使用watch监控sex字段,然后修改sex=man2,虽然在事务命令队列里再将set设置”female”,但结果sex=man2。由些我们可以知道由于在开启事务之前sex被修改了,导致之事务里的命令全部不会执行,这里强调“事务队列里命令全部不会执行

你可能感兴趣的:(redis)