是什么?
可以一次执行多个命令,本质是一组命令的集合。一个事物中的所有命令都会被序列化,按顺序的串行执行而不会被其他命令插入,不许加塞。
能干嘛?
一个队列中,一次性的,顺序的,排他的执行一系列命令。
常用命令
命令 | 描述 |
---|---|
multi | 标记一个事务的开始 |
exec | 执行所有事务块内的命令 |
discard | 取消事务,放弃执行事务块内的所有命令 |
watch key [key] | 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。 |
unwatch | 取消watch命令对所有 key 的监视。 |
这么玩?
-
正常执行
-
放弃事务
-
全体连坐
-
冤头债主
乐观锁和悲观锁
Watch监控
watch指令,类似乐观锁
,如果key的值已经被修改了,那么整个事务队列都不会被执行,同时返回一个Nullmulti-bulk应答以通知调用者事务执行失败。
注意:一旦执行了exec或者discard,之前加的所有监控锁都会被取消掉了。
例子:
初始化信用卡的可用余额和欠额
无加塞篡改
有加塞篡改,当watch的key被修改,后面的那个事务全部执行失败
unwatch
3阶段
开启:以multi开启事务
入队:将多个命令入队到事务中,接到这些命令不会立刻执行,而是放到等待执行的事务队列里面
执行:有exec命令触发事务
3特性
单独的隔离操作:事务中的所有命令都会序列化,按顺序的执行。事务在等待执行的时候,不会被其他客户端发送来的米命令请求打断
没有隔离级别的概念:队列中的所有命令没有提交exec之前都是不会被执行的
不保证原子性:redis中如果一条命令执行失败,其后的命令仍然会被执行,没有回滚,参考冤头债主