- MULTI 命令:将客户端从非事务状态切换到事务状态,标志着事务的开始。
- EXEC 命令:客户端向服务端发送该命令后,服务器会遍历这个客户端的事务队列,并将所有命令的执行结果返回给客户端。
- WATCH 命令:乐观锁,可以在 EXEC 命令执行之前,监视任意数量的数据库键,并在EXEC 命令执行的时候,检查被监视的键是否至少有一个已经被修改过了,如果有,服务器将拒绝执行该事务,并向客户端返回代表事务执行失败的空回复。
> MULTI # 事务开始
OK
> SET USER "a"
QUEUED
> GET USER
QUEUED
> EXEC # 遍历客户端的事务队列,并将所有命令的执行结果返回给客户端
1) OK # 设置 user 为 "a" 成功
2) "a" # 获取 user 数据> WATCH USER # 监视 user
OK
> MULTI
> SET USER "a" # 修改 user 数据
OK
> GET USER
"a"
> EXEC # user 发生了修改,拒绝执行该事务
ERR EXEC without MULTIRedis 通过 MULTI、EXEC、WATCH 等命令来实现事务功能。
事务提供了一种将多个命令请求打包,然后一次性、按顺序地执行多个命令的机制。服务器在执行事务期间,不会改去执行其它客户端的命令请求,它会将事务中的所有命令都执行完毕,然后才去处理其他客户端的命令请求。
事务中的多个命令被一次性发送给服务器,而不是一条一条发送,这种方式被称为流水线 (pipeline)。
注意:
-
Redis 最简单的事务实现方式是使用 MULTI 和 EXEC 命令将事务操作包围起来。
-
使用 pineline 的好处:Redis 使用的是客户端 / 服务器(C/S)模型和请求/响应协议的 TCP 服务器。Redis 客户端与 Redis 服务器之间使用 TCP 协议进行连接,一个客户端可以通过一个 Socket 连接发起多个请求命令。每个请求命令发出后客户端通常会阻塞并等待 Redis 服务器处理,Redis 处理完请求命令后会将结果通过响应报文返回给客户端,因此当执行多条命令的时候都需要等待上一条命令执行完毕才能执行。
pipeline 可以一次性发送多条命令并在执行完后一次性将结果返回,可以减少客户端与服务器之间的网络通信次数从而提升性能,并且 pineline 基于队列,而队列的特点是先进先出,这样就保证数据的顺序性。
Redis 是不支持事务回滚的,因而不满足数据库原子性的(而且不满足持久性)。
即使事务队列中的某个命令在执行期间出现了错误,整个事务也会继续执行下去,直到将事务队列中的所有命令都执行完毕为止。因为其作者认为,Redis 事务执行时错误通常都是编程错误产生的,这种错误通常只会出现在开发环境中,而很少会在实际的生产环境中出现,所以他任务没有必要开发 Redis 的回滚功能。
Redis 事务本质上提供了一种将多个命令请求打包功能,然后按顺序执行打包的所有命令,并且不会被中途打断。