redis事务是什么
- 可以一次执行多个命令,本质是一组命令的集合
- 一个事务中所有的命令都会序列化 按顺序的串行化执行而不会被其他命令插入 不许加塞
能干什么
- 一个队列中 一次性 顺序的 排他性的执行一系列命令
怎么弄
- 常见命令
- multi 标记一个事务块的开始
- exec 执行所有事务块内的命令
- discard 取消事务 放弃执行事务块内的所有命令
- unwatch 取消watch命令对所有key的监视
- watch key1 key2... 监视一个key 如果事务执行之前这个key被其他命令所改动 那么事务将被打断
- 正常执行
- 放弃事务
- 全体失效
- 取消h执行错误的指令
- watch监控
- redis使用watch 来提供乐观锁锁定 类似于cas check and set
- 一容具荣 一损俱损
- 监控 key
- 在multi内修改前 被另一个端口修改后 multi内的命令都会失效 就类似于 multi内的指令语法由错误
- 初始化 k1 和balance 两个key先监控 再开启multi 保证两个key变动在同一个事务内
- redis使用watch 来提供乐观锁锁定 类似于cas check and set
redis 与 mysql
单独的隔离操作 | Redis的事务仅仅是保证事务里的操作会被连续独占的执行,redis命令执行是单线程架构,在执行完事务内所有指令前是不可能再去同时执行其他客户端的请求的 |
---|---|
没有隔离级别的概念 | 因为事务提交前任何指令都不会被实际执行,也就不存在"事务内的查询要看到事务里的更新,在事务外查询不能看到"这种问题了 |
不保证原子性 | Redis的事务不保证原子性,也就是不保证所有指令同时成功或同时失败,只有决定是否开始执行全部指令的能力,没有执行到一半进行回滚的能力 |
排他性 | Redis会保证一个事务内的命令依次执行,而不会被其它命令插入 |
总结
开启 multi 开始一个事务
入队 将多个命令入队到事务中 接到这些命令不会立即执行 而是放到等待执行的事务中的队列里面
执行 由exec命令触发事务