一、Redis事务三大特性

  • Redis事务是一个单独的隔离操作:事务中的所有命令都会被序列化,按顺序的执行,事务在执行过程中不会被其他客户端发来的命令所打断。
  • Redis事务没有隔离级别的概念:队列中没有 提交之前都不会被执行。
  • 不保证原子性:事务中如果有一条命令执行失败,其他的命令仍然执行,不保证回滚

二、Redis事务的三个指令

  • Multi :开始事务
  • Exec :执行事务
  • discard :回滚事务

三、事务运行的流程

1、multi

当输入Multi开始事务之后,会进入’组队‘状态‘ ,这时候开始串联一系列指令

下面说明在组队阶段可能发生的事情

在这个阶段,所有的指令都不会真正执行,会收集完所有的指令直到输入Multi,如果在这个过程中,其中一个指令出错了,那么整个事务都不会成功执行。如下图所示,set key 不加value,显然是错误的指令,于是返回了一个error信息。

当我们输入exec执行事务的时候就会整个报错

2、exec

上面也介绍过了,输入exec会结束收集指令,开始执行指令,在这个过程中,指令是互相不干扰的,如果有一条指令出错误,那么最终的结果就是一条失败,其他成功。

现在我们先存入一系列没错误但是运行会出错的指令

在这些指令中,格式都是正确的,但是第二条指令incr是用于value自增的,而value必须是数值,现在v1是个字符串类型,所以执行第二条的时候肯定会出错,现在的结果就是第一和第三条成功,第二条失败

3、discard

用于事务的回滚。在收集指令时,如果不想执行了,可以输入discard停止事务并且不执行事务。

4、总结

 在multi开启事务组队阶段出现指令错误时,输入exec执行的时候会全部失败,而在组队阶段的指令都没问题,输入exec执行指令时,如果某个指令出错了,不会影响其他指令的执行。

四、事务冲突

1、锁的概念

悲观锁:每次去拿数据的时候,都认为别人会修改数据,所以每次拿数据时都加上锁。

乐观锁:每次去拿数据都不认为别人会修改数据,但是在更新前会判断此间有没有人修改过数据,可以通过版本号控制

2、watch监控事务

用watch监控事务,在执行一系列指令时,如果发现已经被修改过了,那么就取消执行

A客户端开启了监控balance这个key  然后开启事务,将自增30的操作加入队列中

 B客户点也同样的

这时候A客户先执行了并且执行成功

B客户再执行,会发现值已经发生变化了,于是执行失败

 

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐