Redis 事务的介绍及应用

731 阅读2分钟

简介

事务指访问并可能更新数据库中各种数据项的一个程序执行单元(unit),通俗来说就是事务当中执行的命令要么全部完成,要么全部不完成

事务需要满足ACID原则

Redis事务只能保证两点

  1. 数据在watch之后,multi之前没有发现改变,否则事务不执行
  2. 在multi之后,exec之前的redis命令是串行执行的,中间线程阻塞,不会插入其他命令

Redis事务的问题在于

执行exec批量命令后,中间任何步骤失败,并不会回滚事务,会完成可以完成的部分

执行流程

Redis使用WATCH命令来决定事务是继续执行还是回滚,那就需要在MULTI之前使用WATCH来监控某些键值对,然后使用MULTI命令来开启事务,执行对数据结构操作的各种命令,此时这些命令入队列。

当使用EXEC执行事务时,首先会比对WATCH所监控的键值对,如果没发生改变,它会执行事务队列中的命令,提交事务;如果发生变化,将不会执行事务中的任何命令,同时事务回滚。当然无论是否回滚,Redis都会取消执行事务前的WATCH命令

命令说明

命令 描述
MULTI 用于标记事务的开始,其后执行的命令都将被存入命令
EXEC 执行在一个事务内命令队列中的所有命令,同时将当前连接的状态恢复为正常状态,即非事务状态。如果在事务中执行了WATH命令,那么只有WATCH所监控的Keys没有被修改的前提下,EXEC命令才能执行事务队列中的所有命令,否则EXEC将放弃当前事务中的所有命令
DISCARD 回滚事务队列中的所有命令,同时再讲当前连接的状态恢复为正常状态,即非事务状态。如果WATCH命令被使用,该命令将UNWATCH所有的Keys
WATCH key[key ...] 在MULTI命令执行之前,可以指定待监控的Keys,然后在执行EXEC之前,如果被监控的Keys发生修改,EXEC将放弃执行该事务队列中的所有命令
UNWATCH 取消当前事务中指定监控的Keys,如果执行了EXEC或DISCARD命令,则无需再手动执行该命令了,因为在此之后,事务中所有被监控的Keys都将自动取消