五 Redis 事务
5.1 介绍
- 可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化, 按顺序地串行化执行而不会被其他命令插入,不许加塞
- 一个队列中,一次性、顺序性、排他性的执行一系列命令
5.2 Redis事务和数据库事务
![在这里插入图片描述](https://img-blog.csdnimg.cn/8241e74ab28246ce8abe0e978abc8711.png)
5.3 基本操作
![在这里插入图片描述](https://img-blog.csdnimg.cn/77de31134c584758844393c9b167c6c9.png)
正常执行
MULTI // 事务开始
EXEC // 执行事务
![在这里插入图片描述](https://img-blog.csdnimg.cn/f52e77ce58044f6295ce8a0627fb173b.png)
放弃事务
MULTI // 事务开始
DISCARD // 放弃事务
![在这里插入图片描述](https://img-blog.csdnimg.cn/e7a92694413e411280b982a978c7a4e3.png)
全体连坐
MULTI // 事务开始
EXEC // 执行
![在这里插入图片描述](https://img-blog.csdnimg.cn/ddfe43214c554b71b8cc2b70b8abf79e.png)
- 在MULTI 和 EXEC 之间有一个指令语法错误,所有的命令都不会执行,
冤头债主
- Redis 不提供事务回滚的功能,开发者必须在事务执行出错后,自行恢复数据库状态
- 注意和传统数据库事务区别,不一定要么一起成功要么一起失败
MULTI // 事务开始
EXEC // 执行
![在这里插入图片描述](https://img-blog.csdnimg.cn/b63988fcee144449afb0f1514fd03610.png)
Watch 监控
- Redis使用Watch 来提供乐观锁定,类似于 CAS(Check-and-Set)
- 悲观锁
- 认为每次去拿数据都很认为别人会修改,所以每次拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁
- 乐观锁
- 认为每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据
- 提交版本必须 大于 记录当前版本才能执行更新
- CAS
- check-and-set(JUC中CAS操作相似)
watch
unwatch
![在这里插入图片描述](https://img-blog.csdnimg.cn/3efca3f014534c64ad37c82840c2d73d.png)
小结
- 一旦执行了 exec 之前加的watch监控锁都会被取消掉
- 当客户端连接丢失的时候(比如退出连接),所有东西都会被取消监视
5.4 总结
- 开启
- 入队
- 将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面
- 执行