Redis高级 之 事务
Redis事务的本质是一组命令的集合。
Redis的事务分为以下三个阶段:
- 开启:以MULTI开始一个事务
- 入队:将多个命令入队到事务中,这些命令并不会立即执行,而是放到等待执行的事务队列里面,最后一起执行
- 执行:由EXEC命令触发事务
Redis事务相关命令:
- multi:标记一个事务块的开始。
- exec:开始执行事务块内的所有命令。
- discard:取消事务,放弃执行事务块内的所有命令。
- watch key [key …]:监视一个(多个) key ,如果在事务执行之前这些key中的任意一个被其他命令所改变,那么事务将被打断,这种情况通常可以在程序中重新尝试一次。
- unwatch:取消 watch 命令对所有 key 的监视。
- multi:标记一个事务块的开始
- discard:取消事务,放弃执行事务块内的所有命令
- exec:执行事务块内的所有命令 3.1 全体连坐(语法有问题,编译时就出错)
3.2 冤头债主(语法没有问题,运行时才出错)
第一步:打开客户端A,在其中初始化余额和支出,在事务中间完成一次25元的消费,采用先监控再开启的方式,同时保证两笔金额变动在同一个事务内,如下图所示: 第二步:在客户端A中,再次监视余额balance,如下图所示:
第三步:再打开一个客户端B,在其中给余额增加500元,如下图所示:
第三步:在客户端A中再做一次25元的消费,如下图所示:
上面代码说明,监控了key的情况下,如果key在别的进程中被被修改了,后面一个事务的执行失效。
第三步若采用unwatch,则会正确远行,如下图所示: