13.MySQL锁机制
锁的分类
从对数据的类型 (读\写)分:
1.读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响
2.写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁
从对数据操作的粒度分:
1.表锁
2.行锁
表锁(偏读)
1.偏向MyISAM存储引擎,开销小,加锁快;无死锁;锁的粒度大,发生锁冲突的概率最高,并发度最低
2.MyISAM 在执行查询(SELECT)语句前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE/DELETE/INSERT等)前,
会自动给涉及的表加写锁,这个过程并不需要用户参与,我们试验中使用 lock table 是为了模拟并发环境
加读锁
1.会话一中A表加读锁(lock table tablename read),会话二不锁任何表
2.会话一中 可以查询A表,也只能查询A表,对A表的写操作会报错,对其他的表的读写操作也报错
3.会话二中,可以读A表,也可以对其他表进行读写,但只对A表的写操作会阻塞,必须等会话一释放 A表的读锁(unlock tables),会话二才能完成写操作
加写锁
1.连接一,给一张表加 写锁,这个连接可以对这张表进行 读和写,但是不能访问其他表
2.连接二 可以访问其他未加锁的表,但是对加了写锁的表 的读 和 写 会阻塞(即排他),等待连接一中锁的释放
简而言之,就是读锁会阻塞写,但是不会阻塞读,而写锁则会把 读和写 都阻塞(对于其他连接而言)
表锁分析 show status like ‘table%’
行锁(偏写)(行锁出现的前提是在事务中)
1.偏向 Innodb 存储引擎,开销大,加锁慢;会出现死锁;锁的粒度最小,发生锁冲突的概率最低,并发度也最高
2.Innodb 和 Myisam最大不同的有两点:一是只是事务(TRANSACTION);二是采用了行级锁
3.由于行锁支持事务,我们复习一下关于事务的知识
1.事务及其ACID属性
2.并发事务 带来的问题
1.更新丢失(Lost Update)
2.脏读(Dirty Reads)
3.不可重复读(Non-Repeatable Reads)
在事务A的执行过程中,事务B进行了开启,修改和提交,导致事务A在事务B执行前读取的数据和事务B执行后读取的数据不一致
4.幻读(Phantom Reads)
和 不可重复读 类似,不过不可重复读针对的列的修改,而幻读针对的是列的增删
3.事务隔离级别
4.行锁定基本演示:事务中对数据的更新才会触发行锁,
如:连接一开启了事务,在事务中,对表的某一行数据进行更新(此时就把这一行锁定了)(查询不会锁定),
在该事务提交之前, 连接二发出了update语句,想对被锁的这一行数据进行更新,此时 连接二的语句就会发生阻塞,
需要到等待连接一中 事提交,行锁释放,才能继续执行
但是因为是行锁,所以连接二对其他行的数据更新是不会受影响的
5.无索引行锁升级为表锁(索引失效)
当出现行锁时,如果行锁锁定的这一行上面 有字段(如name)建立了索引,如果这个索引失效了(比如字符型不加‘’ where name = 1234),
那么行锁 会自动升级为表锁,其他行数据的 更新 也会被锁定,其他连接无法对这个表进行更新
6.间隙锁(宁可错杀,不可错放)
当我们使用范围条件而不是相等相等条件检索数据时,它会锁定整个范围内所有的索引键值,即使这个键值并不存在
如:有这样一段数据,id = 1,id = 3,id = 4...中间少了一个 id = 2,如果此时连接一 开启一个事务,更新数据当 1<id <4,
此时Mysql本着宁可错杀,不可错放的原则,即使id=2 不存在也会被无情的锁定,
连接二想要插入 一条id=2的数据是不行的,会阻塞,等待连接一事务提交,行锁释放
7.如何锁定一行
for update可以锁定某一行,也可以锁定整张表
主要是看 select语句后面是否有where,where限定的范围 即锁的范围, select xxx... for update
如果没有 where,则锁定整张表,锁定之后,其他连接 就无法对锁定的范围进行 更新操作
8.行锁分析:show status like 'innodb_row_lock%'
为什么说行锁偏写,表锁偏读,即Myisam偏读,Innodb偏写
Myisam 读的性能高
Myisam 的读写锁调用 是读优先,这也是myisam不适合做写为主表的引擎。因为写锁后,其他线程不能做任何操作,大量的更新会使查询很难得到锁,从而造成永久阻塞
Innodb行锁是单比查询比不过,但是innodb支持高并发,支持事务
在写多读少的应用中还是Innodb插入性能更稳定,在并发情况下也能基本保证性能
可以根据系统的读写情况 来选择合适的 Mysql存储引擎
优化建议
1.尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁
2.合理设计索引,尽量缩小锁的范围
3.尽可能较少检索条件,避免间隙锁
4.尽量控制事务大小,减少锁定资源量和时间长度
5.尽可能低级别事务隔离
页锁(了解一下即可)
1.开销和加锁时间介于表锁和行锁之间
2.会出现死锁
3.锁定粒度介于表锁和行锁之间,并发度一般
13.MySQL锁机制的更多相关文章
- 再谈mysql锁机制及原理—锁的诠释
加锁是实现数据库并发控制的一个非常重要的技术.当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁.加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更 ...
- mysql锁机制 读书笔记
目录 MySQL锁机制 1.什么是锁 2.lock与latch 3.InnoDB存储引擎中的锁 3.1锁的类型 3.2 一致性非锁定读 3.3 一致性锁定读 4 锁的算法 4.1行锁的3中算法 4.2 ...
- Mysql锁机制介绍
Mysql锁机制介绍 一.概况MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking ...
- Mysql锁机制--索引失效导致行锁变表锁
Mysql 系列文章主页 =============== Tips:在阅读本文前,最好先阅读 这篇(Mysql锁机制--行锁)文章~ 在上篇文章中,我们看到InnoDB默认的行锁可以使得操作不同行时不 ...
- mysql锁机制详解
前言 大概几个月之前项目中用到事务,需要保证数据的强一致性,期间也用到了mysql的锁,但当时对mysql的锁机制只是管中窥豹,所以本文打算总结一下mysql的锁机制. 本文主要论述关于mysql锁机 ...
- 对mysql锁机制的学习
1.对于mysql学习,经常翻看一些博客,论坛,好像或多或少有mysq锁机制的学习与总结,所以今天有必要 对mysql锁机制的一些个人的总结,以便以后深入的学习. 2.学习这件事,从来都是“深入浅出” ...
- mysql锁机制(转载)
锁是计算机协调多个进程或线程并发访问某一资源的机制 .在数据库中,除传统的 计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所 ...
- mysql锁机制和事务隔离
mysql事务 1.InnoDB事务原理 事务(Transaction)是数据库区别于文件系统的重要特性之一,事务会把数据库从一种一致性状态转换为另一种一致性状态. 在数据库提交时,可以确保要么所有修 ...
- (三)MySQL锁机制 + 事务
转: (三)MySQL锁机制 + 事务 表锁(偏读) 偏向MyISAM存储引擎.开销小,加锁快,无死锁,锁定粒度大,发生锁冲突的概率最高,并发最低. 查看当前数据库中表的上锁情况,0表示未上锁. sh ...
随机推荐
- Qt打开文件QFileDialog
//打开Pts文件按钮点击事件void AnalysisPtsDataTool201905::OnOpenFileButtonClick(){ qDebug()<<"open f ...
- MySQL标准化、自动化部署
机器标准化:服务器的硬件配置(CPU.硬盘.内存.RAID)要保持一致 目录标准化: mysql的安装目录,存放数据的目录.日志文件等,多台机器上配置要统一 参数标准化: 多台服务器上,存放的my.c ...
- 程序间获取ALV显示数据(读取ALV GRID上的数据)
程序间获取ALV数据的两种方法: 方法1:通过修改SUBMIT的目标程序,把内表EXPORT到内存,SUBMIT后IMPORT ,该方法需要修改目标程序,可以任意设置目标程序的中断点: * Execu ...
- pcntl_fork()函数说明
pcntl_fork()函数复制了当前进程的PCB,并向父进程返回了派生子进程的pid,父子进程并行,打印语句的先后完全看系统的调度算法,打印的内容控制则靠pid变量来控制.因为我们知道pcntl_f ...
- elasticsearch启动日志报错not enough master nodes discovered during pinging (found [[]], but needed [-1]), pinging again
排查步骤 逻辑上讲是,一个节点去ping master节点,结果却没有得到回应,多次重试依旧失败.应该重点观察: 1.master启动后,IP是否可以有防火墙权限,设置防火墙规则或则直接关闭防火墙 ...
- Cracking the coding interview目录及资料收集
前言 <Cracking the coding interview>是一本被许多人极力推荐的程序员面试书籍, 详情可见:http://www.careercup.com/book. 第六版 ...
- 43.QQ聊天软件GUI窗口编写
QQ聊天软件代码功能编写 一,Tkinter聊天界面编写 1,聊天软件客户端界面开发-1 Tkinter的模块(“TK接口”)是标准的Python接口从Tk的GUI工具包 https://i.cnbl ...
- redis设置密码和其它服务器连接
在cenos中 vim /etc/redis.conf 中 /输入 requirepass enter件一下 小写 n 一下 吧 # requirepass #去掉,后面写你的密码 #其它机器连接 v ...
- rqnoj PID95:多多看DVD(加强版)
题目描述 多多进幼儿园了,今天报名了.只有今晚可以好好放松一下了(以后上了学后会很忙).她的叔叔决定给他买一些动画片DVD晚上看.可是爷爷规定他们只能在一定的时间段L看完.(因为叔叔还要搞NOIP不能 ...
- APUE ☞ 文件和目录
粘着位(Sticky Bit) S_ISVTX位被称为粘着位.如果一个可执行程序文件的这一位被设置了,程序第一次运行完之后,程序的正文部分的一个副本仍被保存在交换区(程序的正文部分是机器指令).这使得 ...