Redis(三)Redis事务

前言

我们都知道,MySQL的事务是遵循ACID四大原则,即原子性、一致性、隔离性、持久性。Redis中的事务和MySQL一样,要么同时成功,要么同时失败但,Redis中的事务是不保证原子性的,且不存在隔离级别的概念。Redis事务的本质是一组命令的集合,一个事务的所有命令都会被序列化,在事务执行过程中,会按照顺序执行,执行完一组后,需要重新开启事务。Redis的事务可以理解为:一次性、排他性、顺序性。

事务

Redis的事务分为三个阶段

  • 开启事务(multi)
  • 命令入队(...)
  • 执行事务(exec)
  • 放弃事务(discard)

那么如果命令有错误怎么办呢?此时,我们可以关联到Java的异常,Java中的Exception分为运行时异常和非运行时异常。


 

编译型异常(代码有错,不通过编译):事务中所有的命令都不会被执行。

运行时异常(通过编译,运行时错误,例如1/0):如果命令队列中存在语法性错误,那么执行命令的时候,其他命令可以正常运行。

 

 监控(Watch)

悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁


 

乐观锁:总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现

watch key [key...] 

正常执行成功的情况

Redis监视money的时候,当另一个线程去修改了money,此时事务会执行失败。这个时候需要先去执行unwatch key [key...]将money进行解锁,然后在进行具体操作。Redis watch命令可用作乐观锁实现 

 

posted @ 2021-09-24 17:57  passex  阅读(100)  评论(0)    收藏  举报