介绍
可以一次执行多个命令,本质是一组命令的集合。一个事物中的所有命令都会被序列化,按顺序的串行执行而不会被其他命令插入,不许加塞。
性质
一个队列中,一次性的,顺序的,排他的执行一系列命令。
常用命令
| 命令 | 描述 |
|---|---|
| DISCARD | 取消事务,放弃执行事务块内的所有命令 |
| EXEC | 执行所有事务块内的命令 |
| MULTI | 标志一个事务的开始 |
| UNWATCH | 取消watch命令对所有 key 的监视 |
| WATCH key [key] | 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断(一旦执行了exec或者discard,之前加的监控锁都会被取消掉) |
案例分析
综合redis执行事务出现各种情况,总结有以下5点内容:
- 正常执行
- 放弃事务
- 近朱者赤
- 冤头债主
- watch监控
- 初始化数据
- 无加塞篡改,先开启监控再执行事务,保证两个值改动在同一个事务内
- 有加塞情况,监控了key并且提交事务前期间,如果key被修改了,事务执行失效
注:一旦执行了exec或者discard,之前加的监控锁都会被取消掉
- 初始化数据
- unwatch取消监控
总结
- 单独的隔离操作:事务中的所有命令都会序列化,按顺序的执行。事务在等待执行的时候,不会被其他客户端发送来的米命令请求打断。
- 没有隔离级别的概念:队列中的命令没有提交(exec)之前都是不会被执行的,只是有序的入队而已。
- 不保证原子性:由冤头债主可知,redis中如果一条命令执行失败,其后的命令仍然会被执行,没有回滚,