redis学习十七:redis事务

概念:可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其他命令插入,不许加塞。

1.单独的隔离操作

redis的事务仅仅是保证事务里的操作会被连续独占的执行,redis命令执行是单线程架构,

在执行完事务内所有指令前是不可能再去同时执行其他客户端的请求的

2.没有隔离级别的概念

因为事务提交前任何指令都不会被实际执行,也就不存在“事务内的查询要看到事务里的更新,

在事务外查询不能看到”这种问题了

3.不保证原子性

redis的事务不保证原子性,也就是不保证所有指令同时成功或同时失败,只有决定是否开始

执行全部指令的能力,没有执行到一般进行回滚的能力

4.排它性 redis会保证一个事务内的命令依次执行,而不会被其他命令插入

 

 

 

 

 

 

 

 

实操:

(1)discard:取消事务,放弃执行事务块内的所有命令

(2)exec:执行所有事务块内的命令

(3)multi:标记一个事务块的开始

(4)unwatch:取消watch命令对所有key的监视

(5)watch key[key...]:监视一个或多个key,如果在事务执行之前这个key被其他命令所改动,那么事务将被打断

1.正常执行

queued吧指令放入队列中到时候一起执行

 2.放弃事务

从k3没变化可以看出来放弃成功了

 3.全体连坐

一个语法写错全部不执行

 4.冤头债主

语法没错但是执行报错(因为em对应值没有自增),只有那个错误的没有执行

 5.watch监控(用的乐观锁)

悲观锁:顾名思义,很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁

乐观锁:很乐观,每次去拿的时候认为别不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别有没有去更新这个数据(乐观锁策略:提交版本必须大于记录当前版本才能执行更新)

 

先监控再修改,这样整个事务执行就不会成功,中间事务中使用unwatch放弃监控执行即可成功

 小结:一但执行了exec之前加的监控锁都会被取消掉了

当客户端连接丢失的时候(比如退出连接),所有的东西都会取消监视

总结:

1.开启:multi

2.入队:将多个命令入队到事务中,并不会立即执行,而是放到等待执行的事务队列中

3.执行:由exec命令触发事务

 

posted @   浮笙芸芸  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示