MySQL学习(四)锁机制
- 分类
- 读锁(共享锁):对同一个数据,多个读操作可以同时进行,互不干扰
- 写锁(互斥锁):如果当前写操作没有完毕,则无法进行其他的读操作、写操作
- 操作范围
- 表锁:一次性对一张表整体加锁。如myisam存储使用引擎,开销小,加锁快,无死锁;锁的范围大,容易发生锁冲突,并发低
- 行锁:一次性对一条数据加锁。如innodb使用行锁,开销大,加锁满,容易死锁;锁的范围小,不易发生锁冲突,并发度高(很小概率,发生高并发问题、不可重复读,丢失更新等问题)
- 间隙锁(next-key):值在范围内,但却不存在
此时表中没有id=7的数据
update linelock set name = 'x' wher id > 1 and id < 9;
加锁 lock table 表1 read/write,表2 read/write
查看加锁的表: show open tables;
1.加读锁
结论1:一个会话,对A表加了read锁,则该会话可以对A表进行读操作,不能进行写操作;且该会话不能对其他表进行读、写操作。(即如果给A表加了读锁,则当前会话只能对A表进行读操作)
结论2:会话0对A表加了锁,其他会话的操作:
- 可以对其他表(A表以外的表)进行读、写操作
- 对A表可以读,写-需要等待释放锁
unlocal tables;
2.加写锁
会话0: lock table tablename write;
总结1:当前会话可以对加了写锁的表,可以进行任何操作(增删改查);但是不能操作(增删改查)其他表.
总结2:对会话0加写锁的表,可以进行增删改查的前提是:等会话0释放写锁。
3.行锁分析
- 如果会话x对某条数据a进行DML操作(研究时,关闭了自动commit的情况下),则其他会话必须等待会话x结束事务(commit/rollback)后,才能对数据a进行DML操作
- 表锁是通过 unlock tables; ,也可以通过事务解锁,行锁是通过事务解锁。
- 如果没有索引/索引失效,则行锁会转为表锁
- 行锁:如果有where,则实际加锁的范围就是where后面的范围(不是实际的值 )
show status like '%innodb_row_lock%';

- innodb_row_lock_current_waits; 当前正在等待锁的数量
- innodb_row_lock_time; 等待总时长。从系统启动到现在一共等待的时间
- innodb_row_lock_time_avg; 平均等待时长
如果发现锁争用比较严重,如
InnoDB_row_lock_waits和InnoDB_row_lock_time_avg的值比较高
如果仅仅是查询数据,能否加锁?可以 for update:select * from linelock where id = 2 for update;
4.InnoDB锁问题
参考博客:https://www.cnblogs.com/jpfss/p/8890250.html
InnoDB和MyISAM最大不同有两点:一是支持事务;二是采用了行级锁
- 共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。
- 排他锁(X):允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁。另外,为了允许行锁和表锁共存,实现多粒度锁机制
InnoDB还有两种内部使用的意向锁(Intention Locks),这两种意向锁都是表锁。
- 意向共享锁(IS):事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁。
- 意向排他锁(IX):事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。

如果一个事务请求的锁模式与当前的锁兼容,InnoDB就将请求的锁授予该事务;反之,如果两者不兼容,该事务就要等待锁释放。
意向锁是InnoDB自动加的,不需用户干预。对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁(X);对于普通SELECT语句,InnoDB不会加任何锁;事务可以通过以下语句显示给记录集加共享锁或排他锁。
- 共享锁(S):SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE。
- 排他锁(X):SELECT * FROM table_name WHERE ... FOR UPDATE。
用SELECT ... IN SHARE MODE获得共享锁,主要用在需要数据依存关系时来确认某行记录是否存在,并确保没有人对这个记录进行UPDATE或者DELETE操作。但是如果当前事务也需要对该记录进行更新操作,则很有可能造成死锁,对于锁定行记录后需要进行更新操作的应用,应该使用SELECT... FOR UPDATE方式获得排他锁。
5.InnoDB行锁实现方式
:通过索引上的索引项加锁来实现的。这种行锁特定意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。
MySQL学习(四)锁机制的更多相关文章
- MySQL的innoDB锁机制以及死锁处理
MySQL的nnoDB锁机制 InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION):二是采用了行级锁.行级锁与表级锁本来就有许多不同之处,innodb正常的select ...
- 巧用MySQL InnoDB引擎锁机制解决死锁问题(转)
该文会通过一个实际例子中的死锁问题的解决过程,进一步解释innodb的行锁机制 最近,在项目开发过程中,碰到了数据库死锁问题,在解决问题的过程中,笔者对MySQL InnoDB引擎锁机制的理解逐步加深 ...
- 高性能MySql学习笔记——锁、事务、隔离级别(转)
为什么需要锁? 因为数据库要解决并发控制问题.在同一时刻,可能会有多个客户端对Table1.rown进行操作,比如有的在读取该行数据,其他的尝试去删除它.为了保证数据的一致性,数据库就要对这种并发操作 ...
- MySQL 事务与锁机制
下表展示了本人安装的MariaDB(10.1.19,MySQL的分支)所支持的所有存储引擎概况,其中支持事务的有InnoDB.SEQUENCE,另外InnoDB还支持XA事务,MyISAM不支持事务. ...
- mysql数据库中锁机制的详细介绍
悲观锁与乐观锁: 悲观锁:顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁.传统的关系型数据库里边就用到了很多这 ...
- MySQL事务、锁机制、查询缓存
MySQL事务 何为事务? 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit). 一个事务可以是一条SQL语句,一组SQL语句或整个程序. 事务的特性: 事 ...
- MySQL高级以及锁机制
MySQL高级 推荐阅读: 锁:https://www.cnblogs.com/zwtblog/tag/锁/ 数据库:https://www.cnblogs.com/zwtblog/tag/数据库/ ...
- MySQL- InnoDB锁机制
InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION):二是采用了行级锁.行级锁与表级锁本来就有许多不同之处,另外,事务的引入也带来了一些新问题.下面我们先介绍一点背景知识 ...
- MySQL常用的锁机制 ----------顾名思义
悲观锁与乐观锁: 悲观锁:顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁.传统的关系型数据库里边就用到了很多这 ...
- MySQL数据库的锁机制
在并发访问情况下,很有可能出现不可重复读等等读现象.为了更好的应对高并发,封锁.时间戳.乐观并发控制(乐观锁).悲观并发控制(悲观锁)都是并发控制采用的主要技术方式. 锁分类 ①.按操作划分:DML锁 ...
随机推荐
- Ubuntu20.04 TLS 开机卡在“A start job is running for wait for network to be Configured”解决
问题: 安装ubuntu20.04 TLS系统后,开机卡在"A start job is running for wait for network to be Configured" ...
- linux 设置开机自动挂载文件系统
一./etc/ 下增加rc.local文件(ubuntu默认没有这个文件) kuaibang@face:~$ sudo touch rc.local 二.安装NFS客户端 a.如果您使用CentOS. ...
- 041_Record Type
应用场景:在使用Apex新建记录时,有时需要根据具体需求为用户匹配对应的记录类型,这个时候就需要用到记录类型Id的情况. 获取RecordTypeId的方法有2种,一种是根据soql进行查询,另一种是 ...
- HCIA-ICT实战基础11-网络地址转换NAT&NAPT
HCIA-ICT实战基础-网络地址转换 目录 NAT概述 静态NAT 动态NAT NAPT.Easy-IP NAT Server 扩展 NAT ALG 扩展 双向NAT 扩展 重叠NAT转换方式 1 ...
- Mac 卸载 Anaconda3
终端安装anaconda-clean conda install anaconda-clean 删除所有与 Anaconda 有关的文件与目录 anaconda-clean --yes 第 2 步中的 ...
- L2 Cracia Final Update1 OpCodz
[87] Gracia Final Update 1 Client 00 SendLogOut 01 RequestAttack 03 RequestStartPledgeWar 04 Request ...
- js操作网页元素
二.操作网页元素 1.查找网页元素 给标签设置id属性,一个网页中id的值不能出现重复的 <button id="btn">按钮</button> 2.给按 ...
- xmake构建C/C++编译环境
1. xmake介绍 XMake是一个基于Lua的轻量级跨平台自动构建工具,支持在各种主流平台上构建项目 xmake的目标是开发者更加关注于项目本身开发,简化项目的描述和构建,并且提供平台无关性,使得 ...
- 创建sqlSession对象操作数据库
1.加载核心配置文件 //加载mybatis核心配置文件,获取SqlSessionFactory String resource = "mybatis-config.xml"; I ...
- 20181224蒋嘉豪-exp3-免杀原理与实现
20181224蒋嘉豪-exp3-免杀原理与实现 目录 20181224蒋嘉豪-exp3-免杀原理与实现 课上知识点总结 1.恶意软件检测机制 2.免杀技术综述 Exp3.1 能够正确使用msf编码器 ...