Redis事务

113 阅读2分钟

介绍

Redis事务是一个单独的隔离操作:事务中所有命令都会序列化、按顺序地执行。事务在执行过程中,不会被其他客户端发送来的命令请求所打断。

Redis事务的主要作用就是串联多个命令防止别的命令插队。

Multi、Exec、discard命令

从输入Multi命令开始,输入的命令依次会进入到命令队列中,但不会执行,直到输入Exec后,Redis会将之前的命令队列中的命令依次执行。

组队过程中,可以通过discard来放弃组队。

image.png

案例:

image.png

事务的错误处理

组队中某个命令出现了报告错误,执行时整个的所有队列都会被消失。

image.png

例如:以下为故意输错命令

image.png

如果执行阶段某个命令报出了错误,则只有报错的命令不会被执行,而其他的命令都会执行,不会回滚。

image.png

案例:

image.png

事务冲突的问题

悲观锁

image.png

乐观锁

image.png

WATCH key [key...]

在执行multi之前,先执行watch key1 [key2],可以监视一个或多个key,如果在事务执行之前这个或(这些)key被其他命令所改动,那么事务将被打断。

场景一:使用watch监测balance,事务期间balance数据未变动,事务执行成功

image.png

场景二:使用watch监测balance,事务期间balance数据变动,事务执行失败

image.png

一旦执行EXEC开启事务的执行后,无论事务使用执行成功,WATCH对变量的监控都将被取消。

故当事务执行失败后,需重新执行WATCH命令对变量进行监控,并开启新的事务进行操作。

UNWATCH key [key...]

取消WATCH命令对所有key的监视。

如果在执行WATCH命令之后,EXEC命令或DISCARD命令被执行了的话,那么久不需要在执行UNWATCH了。

Redis事务三特性

  • 单独的隔离操作

    事务中的所有命令都会序列化、按顺序执行。事务在执行的过程中,不会被其他客户端发送过来的命令请求所打断。

  • 没有隔离级别的概念

    队列中的命令没有提交之前都不会实际被执行,因为事务提交前任何指令都不会被实际执行

  • 不保证原子性

    事务中如果有一条命令执行失败,其他的命令仍然会被执行,没有回滚