🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # 正常执行(前提全部写对) ~~~ Jedis jedis = this.init(); Transaction transaction = jedis.multi(); transaction.lpush("key", "11"); transaction.lpush("key", "22"); transaction.lpush("key", "33"); //成功后返回添加在list中的索引 //如果上面是set的话,成功这边是ok,ok List<Object> list = transaction.exec(); System.out.println(list); ~~~ # 全体连坐(一个出错,全部执行失败) ~~~ Jedis jedis = this.init(); try { Transaction transaction = jedis.multi(); transaction.lpush("key", "11"); transaction.lpush("key", "22"); //调用除0,模拟出错 int a = 6 / 0; transaction.lpush("key", "33"); List<Object> list = transaction.exec(); } catch (Exception e) { e.printStackTrace(); } ~~~ # 放弃事务 回滚命令:discard(清除所有先前在一个事务中放入队列的命令,然后恢复正常的连接状态) ~~~ Jedis jedis = this.init(); Transaction transaction = jedis.multi(); transaction.lpush("key", "11"); transaction.lpush("key", "22"); transaction.lpush("key", "33"); //模拟放弃事务,可以加if判断 transaction.discard(); ~~~ # 冤头债主 一个出错,出错的不执行,其他的执行成功! ~~~ Jedis jedis = this.init(); Transaction transaction = jedis.multi(); transaction.set("k1", "11"); transaction.set("k2", "v2"); transaction.set("k3", "33"); //这个不执行,这个执行 transaction.incr("k2"); //这个执行 transaction.set("k4", "44"); List<Object> exec = transaction.exec(); System.out.println(exec); ~~~ 输出 ~~~ [OK, OK, OK, redis.clients.jedis.exceptions.JedisDataException: ERR value is not an integer or out of range, OK] ~~~ # watch监控 添加监视:watch(key),监视某个key的变化,如果在事务执行之前这个(或这些) key被其他命令所改动,那么会取消事务里全部命令。 取消监视:unwatch(key) watch可以监控多个key,使用watch进行key的监控,相当于给key上锁,如果在事务中,监控的key的value发生变化,则整个事务的全部命令都执行失败 ~~~ Jedis jedis = this.init(); //可以watch多个key String watch = jedis.watch("k-1", "k-2"); //watch成功会返回ok System.out.println(watch); //即使是在这边修改watch的key也会造成事务不执行 Thread.sleep(5000); System.out.println("--------"); //开启事务 Transaction multi = jedis.multi(); multi.set("t-1", "v-1"); //休眠,可以模拟修改watch的key Thread.sleep(5000); multi.set("t-1", "v-1"); //执行事务 List<Object> exec = multi.exec(); //事务执行的结果 System.out.println(exec); ~~~ 如果不修改watch返回 ~~~ OK -------- [OK, OK] ~~~ 如果修改了,不论在第一个sleep还是第二个sleep 都是事务失败 ~~~ OK -------- [] ~~~ 当对某个key进行watch时,如果其他的客户端对key进行了更改事务可以做到取消事务操作但是管道不可以 # 总结 redis支持事务处理,语法错误的情况下会确保命令全部执行或全部不执行,而且按添加顺序执行。在运行错误的情况下,redis会忽略错误命令,继续执行下面的命令 在事务中不能同步查询结果,需要结果就在exec处把结果接收