一、简介
Redis
的事务并没有关系型数据库的事务那么复杂,只有几个命令就可以解决:multi/exec/discard/watch/unwatch.
Redis
事务可以一次执行多个命令(允许在一次单独的步骤中执行一组命令), 并且带有以下两个重要的保证:
在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
-
Redis
会将一个事务中的所有命令序列化,然后按顺序执行; -
执行中不会被其它命令插入,不许出现加塞行为。
一个事务从开始到执行会经历以下三个阶段:
-
开始事务
-
命令入队
-
执行事务
事务的错误处理:队列中的某个命令出现了报告错误,执行时整个的所有队列都会被取消。
二、命令
Redis
的事务是通过 MULTI,EXEC,DISCARD 和 WATCH 这四个命令来完成的。
①MULTI EXEC
一个事务的例子,它先以 MULTI 开始一个事务,然后将多个命令入队到事务中,最后由 EXEC 命令触发事务
-
输入
Multi
命令开始,输入的命令都会依次进入命令队列中,但不会执行 -
直到输入
Exec
后,Redis
会将之前的命令队列中的命令依次执行
②DISCARD放弃队列运行
-
输入
Multi
命令开始,输入的命令都会依次进入命令队列中,但不会执行 -
直到输入
Exec
后,Redis
会将之前的命令队列中的命令依次执行 -
命令队列的过程中可以通过
discard
来放弃队列运行
③非队列执行阶段事务的错误处理
事务的错误处理:如果执行的某个命令报出了错误,则只有报错的命令不会被执行,而其它的命令都会执行,不会回滚。
④组队列中事务的错误处理
事务的错误处理:队列中的某个命令出现了报告错误,执行时整个的所有队列都会被取消。
由于之前的错误,事务执行失败
⑤事务的WATCH
WATCH key [key …]
监视一个(或多个) key
,如果在事务执行之前这个(或这些) key
被其他命令所改动,那么事务将被打断。
Redis
不支持回滚(roll back
)。
⑥事务的UNWATCH
Redis Unwatch
命令用于取消 WATCH
命令对所有 key
的监视。
如果在执行WATCH
命令之后,EXEC
命令或DISCARD
命令先被执行的话,那就不需要再执行UNWATCH
了。
正因为redis
不支持回滚功能,才使得redis
在事务上可以保持简洁和快速。
Redis
官网也解释了自己为啥不支持回滚。简单来说就是Redis
开发者们觉得没必要支持回滚,这样更简单便捷并且性能更好。Redis
开发者觉得即使命令执行错误也应该在开发过程中就被发现而不是生产过程中。
你可以将Redis
中的事务就理解为 :Redis
事务提供了一种将多个命令请求打包的功能。然后,再按顺序执行打包的所有命令,并且不会被中途打断。
三、关于watch命令
watch
类似乐观锁的实现,监视一个KEY
,假如KEY
的值中途有修改,会阻止这个事务的执行。
WATCH
:当某个事务需要按条件执行时,就要使用这个命令将给定的键设置为受监控的状态。注意:使用该命令可以实现 Redis
的乐观锁。