Redis(4)Redis事务
Redis事务是一个单独的隔离操作:事务中的所有命令都会被序列化,按顺序的执行,事务在执行过程中不会被其他客户端发来的命令所打断。Redis事务的主要作用就是串联多个命令防止别的命令插队一、Redis事务的三个指令Multi :开始事务Exec :执行事务discard :回滚事务二、事务运行的流程1、multi当输入Multi开始事务之后,会进入’组队‘状态‘ ,这时候开始串联一系列指令下面说明
一、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客户再执行,会发现值已经发生变化了,于是执行失败
更多推荐
所有评论(0)