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命令可用作乐观锁实现。 

浙公网安备 33010602011771号