Redis事务

1. redis事务概念:

可以一次执行多个命令,本质是一组命令的集合。
一个事务中的所有命令都会序列化,按顺序串行化执行而不会被其它命令插入,一次性、顺序性、排他性的执行一系列命令。

2. 5个常用命令:

【1】MULTI: 标记一个事务块的开始
【2】EXEC: 执行事务块中所有的命令
【3】DISCARD: 取消事务,放弃执行事务块内的所有命令
【4】WATCH key[key ...]: 监视一个(或多个)key,如果在事务执行过程中这个key被修改了(如果 exec 返回的结果是 nil 时,表示 watch 监控的对象在事务执行的过程中被修改了),那么事务将被打断,终止执行 watch 命令只能在客户端开启事务之前执行,在事务中执行 watch 命令会引发错误,但不会造成整个事务失败
【5】UNWATCH: 取消之前WATCH命令监视的所有key 事务之前watch监视k, 开始事务, unwatch, 设置k值, exec执行事务 即使在事务的执行过程中,k 值被修改了,因为调用了 unwatch 命令,整个事务依然会顺利执行

3. 4种执行情况:

【1】正常执行
【2】放弃事务
【3】全体连坐(命令中含有语法错误的,均连坐(全部失败))
【4】冤有头,债有主(运行时错误,非语法错误,命令正确的语句正常执行,错误语句返回错误)

4. 执行的3个阶段:

【1】开启:以MULTI开始一个事务
【2】入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面
【3】执行:由EXEC命令触发事务

5. Redis事务3个特性:

【1】单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
【2】没有隔离级别的概念:队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行,也就不存在 ”事务内的查询要看到事务里的更新,在事务外查询不能看到” 这个让人万分头痛的问题。
【3】不保证原子性:redis 同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚。

 

上一篇:2021-9-14 子组件消失+watch异步侦听问题


下一篇:SaltStack状态间的关系模块