1、基本介绍
是什么?
可以一次执行多个命令,本质是一组命令的集合。一个事物中的所有命令都会被序列化,按顺序的串行执行而不会被其他命令插入,不许加塞。
能干嘛?
一个队列中,一次性的,顺序的,排他的执行一系列命令。
怎么玩?
| 命令 | 描述 | 
|---|---|
| multi | 标记一个事务的开始 | 
| exec | 执行所有事务块内的命令 | 
| discard | 取消事务,放弃执行事务块内的所有命令 | 
| watch key [key] | 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。 | 
| unwatch | 取消watch命令对所有 key 的监视。 | 
- 正常执行

- 放弃事务

- 全体连坐(一次出错,全体命令不执行)

- 冤头债主(由此可见Redis只是部分支持事务)

2、watch监控
悲观锁与乐观锁:锁机制参考
watch指令,类似乐观锁,如果key的值已经被修改了,那么整个事务队列都不会被执行,同时返回一个Nullmulti-bulk应答以通知调用者事务执行失败。
注意:一旦执行了exec或者discard,之前加的所有监控锁都会被取消掉了。
例子:
- 
初始化信用卡的可用余额和欠额 
- 
无加塞篡改,先监控再开启multi,保证两笔金额变动在同一个事务内 
- 
有加塞篡改,当watch的key被修改,后面的那个事务全部执行失败 
- unwatch,若在watch中key被修改,则先进行unwatch,然后重新watch监控 

3阶段
- 开启:以 multi 开启事务;
- 入队:将多个命令入队到事务中,接到这些命令不会立刻执行,而是放到等待执行的事务队列里面;
- 执行:有 exec 命令触发事务。
3特性
单独的隔离操作:事务中的所有命令都会序列化,按顺序的执行。事务在等待执行的时候,不会被其他客户端发送来的米命令请求打断。
没有隔离级别的概念:队列中的所有命令没有提交exec之前都是不会被执行的。
不保证原子性:redis中如果一条命令执行失败,其后的命令仍然会被执行,没有回滚,参考“冤头债主”