1、写在前面

最近在看尚硅谷的Redis视频,里面的老师说到了事务冲突,我寻思Redis是单线程的,而且事务还有隔离性,哪来的事务冲突,于是上网搜答案,结果清一色复制粘贴,最后在看官网文档后才想明白这个问题,结论就是Redis没有事务冲突
注:本文不适合没了解过Redis事务的人阅读

2、Redis事务

有三个阶段:

  • 开始事务(MULTI)
  • 命令入队
  • 执行事务(EXEC)/ 取消事务(DISCARD)

有两个保证:

  • 事务中的所有命令都将被串行执行,事务执行过程中,Redis不会接收其它客户端发送的请求
  • 服务器如果在接收到EXEC命令前丢失了客户端连接,那么事务中的所有命令都不会被执行,如果接收到了EXEC命令,那么事务中的所有命令都会被执行。

有两种错误:

  • 入队异常 -> 所有命令都不会被执行
  • 执行异常 -> 除了异常命令外的其它命令都会继续执行

3、WATCH命令

WATCH命令为事务提供CAS(check-and-set),当两个事务产生资源竞争的时候,可以用WATCH对资源进行监控,如果资源发生变化,则取消执行当前事务。下面为大家举个例子说明,假如我们要将钱包里的钱扣减1000(myMoney表示钱包里的钱,初始值假设为1500),那么我们可以使用下面这个命令:

DECRBY myMoney 1000

然后我们会发现上面这个命令执行两次及以上时,myMoney就会变成负数,因此需要先将myMoney值取出来,判断大于等于1000后再进行扣减:

val = GET myMoney
if val >= 1000:DECRBY myMoney 1000

上述命令分了三个步骤(取值、判断、扣减),如果两个客户端同时进行请求,会导致第二个请求执行执行到判断语句时,val还是1500,但是在执行扣减语句时,val已经变成500了,所以要用WATCH命令对myMoney进行监控:

WATCH myMoney
val = GET myMoney
if val >= 1000:MULTIDECRBY myMoney 1000EXEC

上述代码都是伪代码,就是为了说明WATCH怎么跟事务搭配着用。

4、写在后面

其实根据第二节的两个保证,就可以很明确的看出来Redis是没有事务冲突的,因为Redis的两个事务是不可能同时执行的

那为什么要讲WATCH命令呢?

这是由于很多博客都在说因为Redis有事务冲突,所以要用到这个WATCH命令,这里我认为是他们讲错了,实际上是因为两个事务之间会有资源竞争,我认为的事务冲突是两个事务的命令会交叉着执行。

有什么不对的地方请指正!

Redis有事务冲突吗相关推荐

  1. Redis 解决事务冲突之乐观锁和悲观锁

    文章目录 一.Redis的事务冲突问题 二.悲观锁 三.乐观锁 四.乐观锁的使用 五.Redis 事务三特性 一.Redis的事务冲突问题 例子: 比如说,3个人有你的账户:你有10000元 一个人请 ...

  2. 【Redis】事务和锁机制

    一.事务的基本操作 1.redis中事务的概念不同于Mysql数据库中的事务 它是一个单独的隔离操作:事务中所有的命令都会序列化.按照顺序依次执行 事务在执行的过程中,不会被其他客户端发送的命令请求打 ...

  3. Redis的事务和锁机制(乐观锁和悲观锁)

    Redis学习笔记(四) 1,Redis事务的定义 2,Redis事务操作的三个基本命令 3,解决Redis中的事务冲突(乐观锁和悲观锁) 3.1,悲观锁 3.2,乐观锁 3.3,Redis中使用乐观 ...

  4. 有关mysql事务冲突

    1, 有关Mysql 事务冲突 1.1 场景 那么这种情况下, 最终的 **hello **会变成什么呢? 过程是这样的 事务1 开启事务, 记录 a1 就已经被事务隔离机制, 独占锁锁定了, 其他的 ...

  5. Redis中事务的实现流程

    场景 Centos中Redis的下载编译与安装(超详细): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103967334 Re ...

  6. Redis的事务:相关命令 watch 与mysql事务的区别

    Redis事务的概念: Redis 事务的本质是一组命令的集合. 事务支持一次执行多个命令,一个事务中所有命令都会被序列化.在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不 ...

  7. redis的事务总结

    结论 1. redis的事务几乎没什么用,只能在单节点情况下,保证一下顺序性,原子性(只是事务执行时不会被插入其他的命令,并不是真正的原子性) 2. redis的事务无法回滚,无论发生什么错误,都无法 ...

  8. Redis之Redis的事务

    1.Redis的事务是什么 Redis 事务的本质是一组命令的集合,事务支持一次执行多个命令,一个事务中所有命令都会被序列化.(redis事务就是一次性.顺序性.排他性的执行一个队列中的一系列命令). ...

  9. Redis 实用技术——事务

    引言 redis的事务不像关系型数据库的事务那样完整. "快"是redis的特征,在事务管理的过程中,使用muti命令开启事务块,当输入多条命令后,再使用exec命令执行事务块中的 ...

最新文章

  1. 智办事协同办公:数字化转型下的高效工作方式
  2. Android中蓝牙的基本使用
  3. DOM的事件函数this和className等样式注意点
  4. 常见的BIOS硬盘故障现象及急救措施
  5. uboot 的 bootcmd 和bootargs参数详解
  6. 小型网络的组建及排错
  7. 不同网段通过静态路由实现互通,华为S5700交换机开启SSH远程指定IP登陆配置(强烈推荐)
  8. 1070 Bash游戏 V4
  9. Java基础语法之方法的参数传递与综合案例
  10. redis 菜鸟教程
  11. 贵港职称计算机考试网,贵港工程师职称等级时间
  12. 计算机组装方案背景图,白色系主机的另外一种搭配:联力O11MINI装机作业参考...
  13. Anaconda下用python调用ArcGIS的arcpy工具包。并解决【import arcgisscripting,DLL load failed: %1 不是有效的 Win32 应用程序】错误
  14. 论文解读:Missing data imputation with adversarially-trained graph convolutional network
  15. 按出生年月日对身份证号进行排序
  16. 7.2.2我们天赋与经验的局限2
  17. FLD5302升压8.4V充电IC芯片和FLD5303升压12.6V充电IC芯片规格书datasheet
  18. Pandas描述性统计
  19. 乔治亚理工学院计算机专业排名,乔治亚理工学院专业排名及优势专业推荐(2020年USNews美国大学专业排名)...
  20. java里面自行车的属性_Java模拟自行车电动车属性调用

热门文章

  1. 信息学奥林匹克c语言提高组,信息学奥赛提高组一级全攻略!你值得拥有!
  2. PWM整流器双闭环PI参数的整定
  3. 调用QQ客服对话聊天窗口:
  4. 脱壳工具:反射大师的使用详解
  5. Java项目源代码S2SH校园BBS论坛系统
  6. 程序员的金融笔记:经济学原理-宏观经济学-曼昆-第7版
  7. 算法流程图怎么画,免费模板有哪些
  8. QT VTK 结合开发
  9. GO语言和区块链开发准备阶段-默克尔树
  10. 【工具分享】优雅地下载B站高清视频的【神级】解决方案