Redis 事务
可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行执行而不会被其他命令插入。
- 单独的隔离操作
Redis事务仅仅保证事务里的操作会被连续单独执行,Redis命令执行是单线程的,在执行事务内所有指令是不可能同时执行其他客户端的请求的 - 没有隔离级别的概念
因为事务提交前任何指令都不会被实际执行,也就不存在事务内的查询要看到事务里的更新,在事务外的查询不能看到这种问题。 - 不保证 原子性
Redis的事务不能保证原子性,也就是不能保证所有指令同时成功或同时失败,只有决定是否开始执行全部指令的能力,没有执行到一半回退的能力 - 排他性
Redis会保证一个事务内的命令依次执行,而不会被其他命令插入 - 操作 正常执行
multi #开启 一个事务
set k1 v1
set k2 v2
incr k1
get k2
exec #执行命令
- 放弃执行
multi #开启 一个事务
set k1 v1
set k2 v2
incr k1
get k2
discard #执行命令
- 全体连坐 命令添加期间发生错误
multi #开启 一个事务
set k1 v1
set k2 #一个错误的命令
exec #执行命令
- 部分成功,在执行期间发生错误,不提供事务回滚操作
multi #开启 一个事务
set k1 v1
set k2 asdddf #一个错误的命令
incr k2 # 一个不支持自增的值
exec #执行命令
- watch监控
Redis使用watch来提供乐观锁定,类似于CAS check and set
watch 监控的key 在一个事务期间被修改,会导致整个事务整体失败
watch k1
multi
set k1 v1
set k2 v2
exec #在exec之前有别的窗口修改了k1的值,会导致当前事务失败,执行后放弃watch
- 总结
开启 multi 开启事务
入队 不断入队命令
执行 exec执行命令