【三大锁】悲观锁——mysql悲观锁
一 三大常用锁
- 悲观锁
- 你准备去银行取10w了,跟银行提前打个招呼,有个10w现金谁都别动。(一般只限制写-别人不能取那10w但是能查到银行总体余额,某些场景会限制读)
- 乐观锁
- 你准备取10w了,不打招呼,撸起袖子(开始事物,准备好回滚),直接去银行,到了之后,银行告诉你10w在那里,你正好取走(事物提交)。 也有可能去了后,银行说10w没了,那你不取了(事物回滚)
- 这里面涉及到一个细节,你拿的10w可能是 路人甲 早上取走了最后10w,然后在你到达之前 路人乙 存了10w。 如果你的业务场景是必须要银行的新钱,而不是别人刚存的,那你可以问下银行这个钱是否有人动过(标记操作流水版本号,cas算法的特点)
- 分布式锁
- 饭店门口很多顾客(多个访问线程),但是餐桌资源只有空闲的时候才会让人进去。有客户取消或者用餐完毕,某个4人桌就空闲出来了,你就可以去抢占这个4人桌的号(分布式锁),先来先得!(和排号系统还是有点不一样的)
二 实现方式
- 分布式锁
- 基本都是拿悲观锁(如 redis: setnx+看门狗+unique_value)
- 乐观锁
- redis的watch
- mysql的step1: select step2: update .set. where id = pre_id and version = pre_version 然后判断result是否>0
- cas算法基本原理类似,需考虑version
- 悲观锁
- reids的setnx + 看门狗
- 不限制消息发送频率只限制重复发送的场景,可以带上msgid作为setnx的value
- 怕del错lock,可以把uniq_id 作为setnx的value,然后del之前,get判断uniq_id是否一致! get和del可以通过lua制作成原子命令!
- mysql的select for update (本文重点)
三 mysql悲观锁
用户x下单,系统查询是否有存货,生成订单balabala ( 我们称为process ),存货-1
process的过程中,可能用户y 就下单了,或者比你下单早的用户z 刚好结算到存货-1了,那用户x 直接把库存降到-1了。 虽然可能有数据库unsigned等保护,那如果库存设置的是底货必须是10以上呢?
所以我们要用到select .. for update
这玩意就是把select 直接锁住,不让别人增删改(查允许)
如果命中了索引,含主键索引、唯一索引,那么是行锁;否则是表锁;
cmd1 不commit
cmd2 会阻塞
然后cmd1 commit;则cmd2 success
如果cmd2要update等操作,会命中cmd1的查询结果行(只要包含cmd1的结果,你想想,别人锁住了,你却要动他,虽然你要动1w行,只有其中一行是cmd1的结果,但是就是卡住了,没办法!), 则会阻塞,时间久了会down;未命中cmd1的查询结果行,则没有任何影响。
cmd1如果resulet为空,那么根据上条结论,也能知道,相当于没锁。
因为name是非索引,这时候直接锁表了,虽然和cmd1的result无关,还是卡住了!
【三大锁】悲观锁——mysql悲观锁相关推荐
- mysql数据库的各种锁_关于MySQL各类锁的总结
想要用好 MySQL,索引与锁是一个绕不开的话题.最近一直在维护以前的业务系统,线上频繁报出数据库死锁的异常警告,为了排查以及规避死锁的问题,因此对 MySQL 的锁(Innodb引擎)做了一个比较深 ...
- mysql锁表查询_mysql锁表查询(mysql查询锁表语句)
mysql锁表查询(mysql查询锁表语句) 2020-07-24 11:44:55 共10个回答 怎么查找mysql中的锁表语句showprocesslist;SHOWPROCESSLIST显示哪些 ...
- mysql proxy 悲观锁_使用MySQL悲观锁解决电商扣库存并发问题
昨天有人提出想看悲观锁,所以今天我们就说一说如何抗悲观锁解决并发问题: 悲观锁介绍(百科): 悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态 ...
- mysql 乐观锁_使用Mysql乐观锁解决并发问题
使用mysql乐观锁解决并发问题 案例说明 银行两操作员同时操作同一账户.比如A.B操作员同时读取一余额为1000元的账户,A操作员为该账户增加100元,B操作员同时为该账户扣除50元,A先提交,B后 ...
- mysql使用条件限制乐观锁_使用Mysql乐观锁解决并发问题
使用mysql乐观锁解决并发问题 案例说明 银行两操作员同时操作同一账户.比如A.B操作员同时读取一余额为1000元的账户,A操作员为该账户增加100元,B操作员同时为该账户扣除50元,A先提交,B后 ...
- php yii 锁,Yii2支持MySQL行锁
Yii2 的 ActiveQuery 默认不支持 MySQL 的行锁.于是扩展了一下. 欢迎来搞. Yii2 Lockable ActiveQuery This package allows you ...
- mysql悲观群_谈谈mysql的悲观和乐观锁
悲观锁与乐观锁是两种常见的资源并发锁设计思路,也是并发编程中一个非常基础的概念.之前有写过一篇文章关于并发的处理思路和解决方案,这里我单独将对这两种常见的锁机制在数据库数据上的实现进行比较系统的介绍一 ...
- mysql某个表被行锁了_MySQL中的锁(表锁、行锁)
锁是计算机协调多个进程或纯线程并发访问某一资源的机制.在数据库中,除传统的计算资源(CPU.RAM.I/O)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所在有数 ...
- mysql 全局锁_Mysql全局锁和表级锁
以前对Mysql的锁的认识,只了解表锁和行锁,其实Mysql的锁的种类还是不少的,有全局锁,表级锁,行级锁,还有元数据锁,间隙锁,临界锁. 一 全局锁 Mysql的全局锁是对整个实例加锁,加锁之后,数 ...
- MySQL数据库锁介绍
MySQL数据库锁介绍 1. 锁的基本概念 当并发事务同时访问一个资源时,有可能导致数据不一致,因此需要一种机制来将数据访问顺序化,以保证数据库数据的一致性. 锁就是其中的一种机制. 我们可以用商场的 ...
最新文章
- Java面试之Java基础上册(含答案)
- python代码执行过程记录_详解python程序中记录日志的方法
- 【linux高级程序设计】(第十一章)System V进程间通信 3
- Nginx if 条件判断
- python自动化办公脚本下载-python自动化脚本
- 如何系统的自学python 知乎-如何系统地自学 Python?
- c语言编写程序数一下 1到100的所有整数中出现多少次数字9
- nullnullC++ LANGUAGE TUTORIAL: CHARACTER ARRAYS...
- AutoMapper在ABP框架中的使用说明
- python基础网易_看看你的Python基础怎么样?
- 【目标跟踪】基于matlab红外图像弱小目标检测与跟踪【含Matlab源码 374期】
- 侵犯我的肖像权及其严重!!强烈禁止使用本人真实头像!!
- 力扣(leetcode)66.加一——c语言新手入门
- 虚拟服务器 切换任务管理器,在远程桌面连接中使用任务管理器(转)
- 干货 | 一步步拆解 Elasticsearch BM25 模型评分细节
- 大一新生HTML期末作业 个人网页王嘉尔明星介绍网页设计与制作
- 只需7步,魔方6面即刻还原!
- 生物特征识别六大技术,你知道多少?
- 领导艺术的“七棵树”
- 4.15 每周作业 —— 简单DP