# Redis 事务命令multi,exec,watch,unwatch,discard
语法错误前期的执行不会被回滚,错误不应该出现在正式环境中。
不像mysql的事务完全回滚。
Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:
* 批量操作在发送 EXEC 命令前被放入队列缓存。
* 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
* 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
一个事务从开始到执行会经历以下三个阶段:
* 开始事务。
* 命令入队。
* 执行事务。
* * *
## 实例
以下是一个事务的例子, 它先以**MULTI**开始一个事务, 然后将多个命令入队到事务中, 最后由**EXEC**命令触发事务, 一并执行事务中的所有命令:
~~~
redis 127.0.0.1:6379> MULTI
OK
redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"
QUEUED
redis 127.0.0.1:6379> GET book-name
QUEUED
redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series"
QUEUED
redis 127.0.0.1:6379> SMEMBERS tag
QUEUED
redis 127.0.0.1:6379> EXEC
1) OK
2) "Mastering C++ in 21 days"
3) (integer) 3
4) 1) "Mastering Series"
2) "C++"
3) "Programming"
~~~
单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。
事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。
> **这是官网上的说明 From redis docs on[transactions](http://redis.io/topics/transactions):**
>
> It's important to note that even when a command fails, all the other commands in the queue are processed – Redis will not stop the processing of commands.
比如:
~~~
redis 127.0.0.1:7000> multi
OK
redis 127.0.0.1:7000> set a aaa
QUEUED
redis 127.0.0.1:7000> set b bbb
QUEUED
redis 127.0.0.1:7000> set c ccc
QUEUED
redis 127.0.0.1:7000> exec
1) OK
2) OK
3) OK
~~~
如果在 set b bbb 处失败,set a 已成功不会回滚,set c 还会继续执行。
* * *
## Redis 事务命令
下表列出了 redis 事务的相关命令:
| 序号 | 命令及描述 |
| --- | --- |
| 1 | [DISCARD](https://www.runoob.com/redis/transactions-discard.html)
取消事务,放弃执行事务块内的所有命令。 |
| 2 | [EXEC](https://www.runoob.com/redis/transactions-exec.html)
执行所有事务块内的命令。 |
| 3 | [MULTI](https://www.runoob.com/redis/transactions-multi.html)
标记一个事务块的开始。 |
| 4 | [UNWATCH](https://www.runoob.com/redis/transactions-unwatch.html)
取消 WATCH 命令对所有 key 的监视。 |
| 5 | [WATCH key \[key ...\]](https://www.runoob.com/redis/transactions-watch.html)
监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。 |
- PHP
- php 简单语法
- php 语法
- PHP书写归范总结
- 代码缩进
- 变量赋值时候
- if条件判断
- 避免嵌入式赋值
- 函数和方法的注释
- php 开发常见问题总结
- 1、查找两个经纬度之间的距离
- 2、PHP常量详解:define和const的区别
- 3、常见面试题及特殊情况
- mysql
- MySQL 介绍
- MySQL 及 SQL 注入
- mysql常见问题
- MySQL数据类型
- MySQL where语句
- MySQL alter 命令
- MySQL 索引
- MySQL 复制表
- MySQL 处理重复数据
- redis
- redis介绍
- redis数据类型(共5种 )
- redis常见问题及使用场景
- redis事务
- Redis 分区
- Linux
- Linux介绍
- Linux 系统目录结构
- Linux 文件与目录管理
- shell
- Shell 教程介绍
- html+css+js
- 优秀技术文章
- 技术链接
- go语言
- go开发规范及注意事项
- go简单语法
- go开发技术总结
- 博客
- 小程序
- 1、页面跳转