《Redis系列》第五章:事务机制

1.是什么

Redis的事务机制和Spring框架的事务功能是相似的,都是保证我在操作某些数据的时候,不被其它的用户干扰,

Redis事务可以一次执行多个命令,本质是一组命令的集合。一个事务中的

所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞

2.命令

序号

命令

描述

1

MULTI

表示一个事务块的开始

2

EXEC

执行所有事务块内的命令

3

DISCARD

取消事务,放弃执行事务块内的所有命令

4

WATCH key [key ...]

监控一个(或多个)key,如果在事务执行之前这个key被其它命令所改动,那么事务将被打断

5

UNWATCH

取消WATCH命令对所有key的监视

3.演示示例

3.1.事务正常执行

通过MULTI命令开始事务,执行一系列命令集合,通过EXEC命令执行事务

3.2.事务取消执行

通过MULTI命令开始事务,可以通过DISCARD取消事务执行

3.3.命令语法错误,全军覆灭

这里的错误命令,是在语法错误,而不是在执行的时候,就类似于Java语言中的编译错误,导致事务全部失败,

3.4.命令执行错误,自作自受

这里的错误命令在加入到执行队列的时候并无问题,因为语法并无问题,但是在执行事务的时候,会报错,和上面Case3的不同,上面的语法错误,这里是执行错误,类似于Java中的编译错误和执行错误

如果执行错误,那么事务执行的结果就是正确的命令顺利执行,错误的命令失败,执行错误的命令不会影响到其它命令的执行

3.5. watch监控

监控成功:watch命令可以用来监控某个key,当我们开启watch以后,然后执行事务,此时在开启事务之前没有其它人加塞篡改监控的key,这个时候没有问题

监控失败:watch命令监控某个key,在开启事务之前,加塞修改了该值,这会导致后面的事务执行

通过WATCH监控A的值,但是在开启事务之前,我们加塞修改了A的值,导致A的值发生了变化,于是在开启事务之后,我们操作了A,因为之前监控的值A发生了变化,所以事务会执行失败

这个在开发中,一般应用场景是同一时间多个人共同修改了同一数据,类似于Java语言多线程共享数据,假如当张三和李四同时操作一个数据,那么当张三操作这个数据的时候,李四也操作这个数据,那么张三的数据有可能是错误,因为李四可能已经把数据修改了,但是张三还没有读取到,于是可以使用WATCH监控,让张三要操作这个数据的时候,使用Redis中的事务监控这个数据,如果在操作的过程中,这个数据被修改,那么会导致这个修改失败,我可以在重复操作,这样虽然可能会重复操作,但是会保证数据肯定正确

取消监控: 我们可以通过WATCH监控某个key值,然后通过 UNWATCH 取消监控

UNWATCH取消的是所有的key监控

一旦执行了exec之前加的监控锁都会被取消掉了

4.事务总结

4.1 执行步骤:

开启:以MULTI开始一个事务

入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面

执行:由EXEC命令触发事务

4.2 事务特性:

单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

没有隔离级别的概念:队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行,也就不存在”事务内的查询要看到事务里的更新,在事务外查询不能看到”这个让人万分头痛的问题

不保证原子性:redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

为人师表好少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值