7.redis事务

131 阅读2分钟

介绍

可以一次执行多个命令,本质是一组命令的集合。一个事物中的所有命令都会被序列化,按顺序的串行执行而不会被其他命令插入,不许加塞。

性质

一个队列中,一次性的,顺序的,排他的执行一系列命令。

常用命令

命令描述
DISCARD取消事务,放弃执行事务块内的所有命令
EXEC执行所有事务块内的命令
MULTI标志一个事务的开始
UNWATCH取消watch命令对所有 key 的监视
WATCH key [key]监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断(一旦执行了exec或者discard,之前加的监控锁都会被取消掉)

案例分析

综合redis执行事务出现各种情况,总结有以下5点内容:

  1. 正常执行

在这里插入图片描述

  1. 放弃事务 在这里插入图片描述
  2. 近朱者赤 在这里插入图片描述
  3. 冤头债主 在这里插入图片描述
  4. watch监控
    • 初始化数据 在这里插入图片描述
    • 无加塞篡改,先开启监控再执行事务,保证两个值改动在同一个事务内 在这里插入图片描述
    • 有加塞情况,监控了key并且提交事务前期间,如果key被修改了,事务执行失效 在这里插入图片描述 注:一旦执行了exec或者discard,之前加的监控锁都会被取消掉
  5. unwatch取消监控 在这里插入图片描述

总结

  1. 单独的隔离操作:事务中的所有命令都会序列化,按顺序的执行。事务在等待执行的时候,不会被其他客户端发送来的米命令请求打断。
  2. 没有隔离级别的概念:队列中的命令没有提交(exec)之前都是不会被执行的,只是有序的入队而已。
  3. 不保证原子性:由冤头债主可知,redis中如果一条命令执行失败,其后的命令仍然会被执行,没有回滚,