介绍
Redis事务是一个单独的隔离操作:事务中所有命令都会序列化、按顺序地执行。事务在执行过程中,不会被其他客户端发送来的命令请求所打断。
Redis事务的主要作用就是串联多个命令防止别的命令插队。
Multi、Exec、discard命令
从输入Multi命令开始,输入的命令依次会进入到命令队列中,但不会执行,直到输入Exec后,Redis会将之前的命令队列中的命令依次执行。
组队过程中,可以通过discard来放弃组队。
案例:
事务的错误处理
组队中某个命令出现了报告错误,执行时整个的所有队列都会被消失。
例如:以下为故意输错命令
如果执行阶段某个命令报出了错误,则只有报错的命令不会被执行,而其他的命令都会执行,不会回滚。
案例:
事务冲突的问题
悲观锁
乐观锁
WATCH key [key...]
在执行multi之前,先执行watch key1 [key2],可以监视一个或多个key,如果在事务执行之前这个或(这些)key被其他命令所改动,那么事务将被打断。
场景一:使用watch监测balance,事务期间balance数据未变动,事务执行成功
场景二:使用watch监测balance,事务期间balance数据变动,事务执行失败
一旦执行EXEC开启事务的执行后,无论事务使用执行成功,WATCH对变量的监控都将被取消。
故当事务执行失败后,需重新执行WATCH命令对变量进行监控,并开启新的事务进行操作。
UNWATCH key [key...]
取消WATCH命令对所有key的监视。
如果在执行WATCH命令之后,EXEC命令或DISCARD命令被执行了的话,那么久不需要在执行UNWATCH了。
Redis事务三特性
-
单独的隔离操作
事务中的所有命令都会序列化、按顺序执行。事务在执行的过程中,不会被其他客户端发送过来的命令请求所打断。
-
没有隔离级别的概念
队列中的命令没有提交之前都不会实际被执行,因为事务提交前任何指令都不会被实际执行
-
不保证原子性
事务中如果有一条命令执行失败,其他的命令仍然会被执行,没有回滚