事务冲突很容易就想到是并发带来的问题。

例子

马上618了、假如一个场景:有很多人有你的账户并且该账户只有10000,同时去参加618抢购,同时发送了三个请求

一个请求想给金额减8000
一个请求想给金额减5000
一个请求想给金额减1000

这三个请求同时发出,假如都执行成功了,那么此时账户的余额就变成了10000-8000-5000-1000 = -4000,此时账户余额变成负的了,显然这在实际生活中是很不合理的。

这时我们能想到的就是加锁了。

悲观锁和乐观锁

1. 悲观锁

顾名思义,就是很悲观的那种,喜欢胡思乱想每次去拿数据的时候总认为别人会改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。

2. 乐观锁

和悲观锁相反在拿到数据时不会加锁,因为他相信这世界是美好的,别人不会修改,但出于严谨还是会在改数据的那一刻会检查一下有没有被人修改。可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。Redis就是利用这种check-and-set机制实现事务的。

乐观锁比悲观锁的效率要高,因为悲观锁每次都会加锁而乐观锁只是在修改数据时检查一下版本号是不是刚拿到的版本号不是就不能执行,是就执行。

redis中WATCH

在执行multi之前,先执行watch key1 [key2],可以监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

实例:
设置一个键为balance 值为10的字符串类型数据。
使用watch监控
开启两个客户端,分别监控后再开启事务对balance进行+100操作,客户端一先提交会成功,客户端二提交会失败,这就是WAYCH对事务监控,防止事务冲突。

客户端一:执行事务成功

客户端二:执行事务失败

总结

  • 在实际应用中很容易出现并发问题、所以我们要在redis事务中加锁解决事务的冲突问题
  • 在redis中使用的check-and-set乐观锁机制实现事务的
  • redis中的乐观锁使用watch命令来实现的

redis事务冲突问题 - 乐观锁和悲观锁相关推荐

  1. mysql悲观锁和乐观优缺点_乐观锁、悲观锁和MVCC各是什么?各自优缺点是什么?...

    在数据库的实际使用过程中,我们常常会遇到不希望数据被同时写或者读的情景,例如秒杀场景下,两个请求同时读到系统还有库存1个,然后又先后把库存更新为0,这时候就会出现超卖的情况,这时候货物的实际库存和我们 ...

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

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

  3. mysql乐观锁与事务_[数据库事务与锁]详解七: 深入理解乐观锁与悲观锁

    注明: 本文转载自http://www.hollischuang.com/archives/934 在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库 ...

  4. Redis锁,悲观锁和乐观锁

    乐观锁 开启事务前,设置对数据的监听(watch),EXEC时,如果发生数据发生过修改,作用于改数据的事务会自动取消(DISCARD),事务EXEC后,无论成败,监听会被移除 悲观锁 每次去拿数据的时 ...

  5. MySql事务4种隔离级别以及悲观锁和乐观锁

    前言:在那鬼公司呆着发现自己居然把事务给搞明白了. 缘由:公司做的一个项目在进行首页内容显示的时候发现查询结果特别慢,有时候需要一到五分钟才能显示出结果.于是乎,我就顺着SQL语句查询慢的原因找了下去 ...

  6. MySQL 乐观锁与悲观锁

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

  7. mysql默认使用悲观锁_mysql乐观锁和悲观锁详解

    mysql乐观锁和悲观锁详解 相信很多朋友在面试的时候,都会被问到乐观锁和悲观锁的问题,如果不清楚其概念和用法的情况下,相信很多朋友都会感觉很懵逼,那么面试的结果也就不言而喻了. 那么乐观锁和悲观锁到 ...

  8. 浅谈实现数据库乐观锁和悲观锁

    目录 数据库乐观锁 适用场景 定义 实现方式 优点与缺点分析 优点 缺点 案例 数据库悲观锁 适用场景 定义 实现方式 悲观锁优缺点分析 优点 缺点 在单实例JVM中,常见的处理并发问题的方法有很多, ...

  9. 数据库 并发更新之乐观锁和悲观锁

    文章目录 1. 问题引出 2. 数据库悲观锁解决并发更新 3. 数据库乐观锁解决并发更新 4. 乐观锁 CAS 的 ABA 问题 5. 拓展思考 5.1. 悲观锁和排他锁.乐观锁和 CAS 分别有什么 ...

  10. 经典问题之乐观锁和悲观锁及使用场景

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

最新文章

  1. PHP mkdir()无写权限的问题解决方法
  2. 蛋疼的mocha库-promise异步测试
  3. JSP的7个动作include,forward,useBean。。。
  4. Python基础教程:set集合的教程
  5. 【问链-Eos公开课】第5课 组建单机多节点EOS网络
  6. 深入浅出之正则表达式(一)
  7. Linux上用户之间对话
  8. 【Git、GitHub、GitLab】九 工作中非常重要的一些git用法
  9. linux安装软件方法汇总
  10. 思科 接入点 本地转发_思科路由器配置 IPv6 和 OSPFv3 路由
  11. CSS入门到精通——表格样式
  12. latex常见实用网址链接
  13. 微信公众平台网页授权两次重定向跳转问题
  14. endless admin_认识Endless OS,轻量级Linux发行版
  15. 哪里买linux虚拟主机的,怎样购买虚拟主机
  16. Layer 打开新页面
  17. QC新旧七图汇总连载9——亲和图
  18. 企业转型升级,务必抓住“企业上云”政策红利
  19. 1875. 贝茜的报复
  20. 【speach】语音信号基础

热门文章

  1. 解决电脑总是“正在识别”,无法获取合法地址
  2. oracle 11g新特性之IPS Packing demonstration
  3. 13.性能之巅 洞悉系统、企业与云计算 --- 案例研究
  4. 6. ubuntu 下 mysql 数据库迁移
  5. 13. PHP 表数据入口(table data gateway)
  6. sql中用于子查询的几个关键词 any(some是 any的别名),all,in,exists
  7. 程序设计中为什么要解耦?
  8. python 并发编程 socket 服务端 客户端 阻塞io行为
  9. 学习ARM的一些基本知识,个人整理
  10. JS重要知识点总结-不完善