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同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚