1.redis事务定义
redis事务是一个单独的隔离操作,事务中的所有命令都会序列化、按顺序地执行,事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。redis事务的主要作用就是串联多个命令防止 别的命令插队。
2.Multi、Exec、discard
从输入Multi命令开始,输入的命令都会依次进入命令队列中,但不会执行,直到输入Exec后,redis会 将之前的命令依次执行。 组队的过程中可以通过discard来放弃组队。
redis事务分2个阶段:组队阶段、执行阶段
组队阶段:只是将所有命令加入命令队列
执行阶段:依次执行队列中的命令,在执行这些命令的过程中,不会被其他客户端发送的请求命令插队或者打断。
multi:标记一个事务块的开始
标记一个事务块的开始。事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由 exec 命令原子性(atomic)地执行。
exec:执行所有事务块内的命令
执行所有事务块内的命令。假如某个(或某些) key 正处于 watch 命令的监视之下,且事务块中有和这个(或这些) key 相关的命令,那么 exec 命令只在这个(或这些) key 没有被其他命令所改动的情况下执行并生效,否则该事务被打断 (abort)。
事务块内所有命令的返回值,按命令执行的先后顺序排列。当操作被打断时,返回空值 nil 。
discard:取消事务
取消事务,放弃执行事务块内的所有命令。返回值总是返回 OK 。
3.redis事务的三特性
(1)单独的隔离操作
事务中的所有命令都会序列化、按顺序地执行,事务在执行过程中,不会被其他客户端发送来的命令请求所打断。
(2)没有隔离级别的概念
队列中的命令没有提交(exec)之前,都不会实际被执行,因为事务提交前任何指令都不会被实际执行。
(3)不能保证原子性
事务中如果有一条命令执行失败,后续的命令仍然会被执行,没有回滚。如果在组队阶段,有1个失败了,后面都不会成功;如果在组队阶段成功了,在执行阶段有那个命令失败就这条失败,其他的命令则正常执行,不保证都成功或都失败。