MySQL数据库的锁(什么是数据库的锁?什么是乐观锁和悲观锁?什么是死锁?如何避免?)
数据库的锁
- 什么是数据库的锁?
- 数据库的锁与隔离级别的关系?
- 数据库锁的类型有哪些?
- MySQL中InnoDB引擎的行锁模式及其是如何实现的?
- 什么是数据库的乐观锁和悲观锁,如何实现?
- 什么是死锁?如何避免?
什么是数据库的锁?
当数据库有并发事务的时候,保证数据访问顺序的机制称为锁机制。
数据库的锁与隔离级别的关系?
隔离级别 | 实现方式 |
---|---|
未提交读 | 总是读取最新的数据,无需加锁 |
提交读 | 读取数据时加共享锁,读取数据后释放共享锁 |
可重复读 | 读取数据时加共享锁,事务结束后释放共享锁 |
串行化 | 锁定整个范围的键,一直持有锁直到事务结束 |
数据库锁的类型有哪些?
按照锁的粒度可以将MySQL锁分为三种:
MySQL锁类别 | 资源开销 | 加锁速度 | 是否会出现死锁 | 锁的粒度 | 并发度 |
---|---|---|---|---|---|
表级锁 | 小 | 快 | 不会 | 大 | 低 |
行级锁 | 大 | 慢 | 会 | 小 | 高 |
页面锁 | 一般 | 一般 | 不会 | 一般 | 一般 |
MyISAM默认采用表级锁,InnoDB默认采用行级锁。
从锁的类别上区别可以分为共享锁和排他锁。
- 共享锁:共享锁又称读锁,简写为S锁,一个事务对一个数据对象加了S锁,可以对这个数据对象进行读取操作,但不能进行更新操作。并且在加锁期间其他事务只能对这个数据对象加S锁,不能加X锁。
- 排他锁:排他锁又称为写锁,简写为X锁,一个事务对一个数据对象加了X锁,可以对这个对象进行读取和更新操作,加锁期间,其他事务不能对该数据对象进行加X锁或S锁。
它们的兼容情况如下:
MySQL中InnoDB引擎的行锁模式及其是如何实现的?
行锁模式
在存在行锁和表锁的情况下,一个事务想对某个表加X锁时,需要先检查是否有其他事务对这个表加了锁或对这个表的某一行加了锁,对表的每一行都进行检测一次这是非常低效率的,为了解决这种问题,实现多粒度锁机制,InnoDB还有两种内部使用的意向锁,两种意向锁都是表锁。
- 意向共享锁:简称IS锁,一个事务打算给数据行加共享锁前必须先获得该表的IS锁。
- 意向排他锁:简称IX锁,一个事务打算给数据行加排他锁前必须先获得该表的IX锁。有了意向锁,一个事务想对某个表加X锁,只需要检查是否有其他事务对这个表加了X/IX/S/IS锁即可。锁的兼容性如下:
行锁实现方式:INnoDB的行锁是通过给索引上的索引项加锁实现的,如果没有索引,InnoDB将通过隐藏的聚簇索引来对记录进行加锁。
InnoDB行锁主要分三种情况:
- Record lock:对索引项加锁。
- Grap lock:对索引之间的“间隙”、第一条记录前的“间隙”或最后一条后的间隙加锁。
- Next-key lock:前两种放入组合,对记录及前面的间隙加锁。
InnoDB行锁的特性:如果不通过索引条件检索数据,那么InnoDB将对表中所有记录加锁,实际产生的效果和表锁是一样的。
MVCC不能解决幻读问题,在可重复读隔离级别下,使用MVCC+Next-Key Locks可以解决幻读问题。
什么是数据库的乐观锁和悲观锁,如何实现?
乐观锁:系统假设数据的更新在大多数时候是不会产生冲突的,所以数据库只在更新操作提交的时候对数据检测冲突,如果存在冲突,则数据更新失败。
乐观锁实现方式:一般通过版本号和CAS算法实现。
悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。通俗讲就是每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁。
悲观锁的实现方式:通过数据库的锁机制实现,对查询语句添加for updata。
什么是死锁?如何避免?
死锁是指两个或者两个以上进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象。在MySQL中,MyISAM是一次获得所需的全部锁,要么全部满足,要么等待,所以不会出现死锁。在InnoDB存储引擎中,除了单个SQL组成的事务外,锁都是逐步获得的,所以存在死锁问题。
如何避免MySQL发生死锁或锁冲突:
- 如果不同的程序并发存取多个表,尽量以相同的顺序访问表。
- 在程序以批量方式处理数据的时候,如果已经对数据排序,尽量保证每个线程按照固定的顺序来处理记录。
- 在事务中,如果需要更新记录,应直接申请足够级别的排他锁,而不应该先申请共享锁,更新时在申请排他锁,因为在当前用户申请排他锁时,其他事务可能已经获得了相同记录的共享锁,从而造成锁冲突或者死锁。
- 尽量使用较低的隔离级别。
- 尽量使用索引访问数据,使加锁更加准确,从而减少锁冲突的机会。
- 合理选择事务的大小,小事务发生锁冲突的概率更低。
- 尽量用相等的条件访问数据,可以避免Next-Key锁对并发插入的影响。
- 不要申请超过实际需要的锁级别,查询时尽量不要显示加锁。
- 对于一些特定的事务,可以表锁来提高处理速度或减少死锁的概率。
推荐阅读:
Java面试题(2022最新持续更新版)
MySQL数据库的锁(什么是数据库的锁?什么是乐观锁和悲观锁?什么是死锁?如何避免?)相关推荐
- mysql悲观锁和乐观区别_MySQL悲观锁和乐观锁的区别是什么
MySQL悲观锁和乐观锁的区别是什么 区别如下: 1.概念不同 乐观锁( Optimistic Locking): 顾名思义,对加锁持有一种乐观的态度,即先进行业务操作,不到最后一步不进行加锁,&qu ...
- mysql乐观锁与事务_[数据库事务与锁]详解七: 深入理解乐观锁与悲观锁
注明: 本文转载自http://www.hollischuang.com/archives/934 在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库 ...
- mysql事务处理是悲观锁还是_数据库事务的悲观锁和乐观锁
转载出处:http://www.hollischuang.com/archives/934 在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数 ...
- mysql悲观锁优化_MySQL数据库优化(三)—MySQL悲观锁和乐观锁(并发控制)
一.悲观锁 1.排它锁,当事务在操作数据时把这部分数据进行锁定,直到操作完毕后再解锁,其他事务操作才可操作该部分数据.这将防止其他进程读取或修改表中的数据. 2.实现:大多数情况下依靠数据库的锁机制实 ...
- 数据库事务的悲观锁和乐观锁
转载出处:http://www.hollischuang.com/archives/934 在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数 ...
- Mysql的那些事儿(部分涉及数据库知识总结)
数据库常见索引类型: 1.B-Tree索引 2.哈希索引 3.空间数据索引(R-Tree) 4.全文索引 数据库并发问题: 1.Lost Update 更新丢失a. 第一类更新丢失,回滚覆盖:撤消一个 ...
- 数据库乐观锁和悲观锁的理解和实现(转载amp;总结)
数据的锁定分为两种,第一种叫作悲观锁,第二种叫作乐观锁. 1.悲观锁,就是对数据的冲突采取一种悲观的态度,也就是说假设数据肯定会冲突,所以在数据开始读取的时候就把数据锁定住.[数据锁定:数据将暂时不会 ...
- 数据库 并发更新之乐观锁和悲观锁
文章目录 1. 问题引出 2. 数据库悲观锁解决并发更新 3. 数据库乐观锁解决并发更新 4. 乐观锁 CAS 的 ABA 问题 5. 拓展思考 5.1. 悲观锁和排他锁.乐观锁和 CAS 分别有什么 ...
- 多线程与高并发基础一(超发--多线程悲观锁,乐观锁、类数据库悲观锁乐观锁)
PS:看完文章后对自己以前所做过的并发和锁机制有了深入原理的了解. 知其然和知其所以然! 遂以记之! 关键词: 线程,同步,单例,高并发,高访问,死锁 一.大规模并发带来的挑战 在过去的工作中,我曾经 ...
- 数据库的锁机制(悲观锁/乐观锁)
在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性. 乐观并发控制(乐观锁)和悲观并发控制(悲 ...
最新文章
- SQL注入漏洞的检测与防范技术
- matlab中的cellstr的用法,matlab中的cell array, cellstr()和char()的用法
- 【整理】SD交货拣配(Picking)处理
- python中itertools groupby函数是干嘛的_Python-如何使用itertools.groupby()?
- mac怎么实现文件读写c语言,使用Sublime Text和Xcode在Mac上进行文件输入/输出。 C语言...
- 【渝粤教育】国家开放大学2018年春季 0507-21T非线性编辑 参考试题
- 将 Fortinet 连接到
- java 访问路径_java获取项目访问路径的相关方法
- 托管元数据(2)——托管元数据和搜索中的精简面板
- L1-025. 正整数A+B-PAT团体程序设计天梯赛GPLT
- oracle bookauthor,Oracle 聚簇(征集)
- [渝粤教育] 中国地质大学 结构力学 复习题 (2)
- Algorithm -- 字母重排
- PROSAIL模型前向模拟与植被参数遥感提取代码实践
- ROS笔记(38) Xbox360手柄控制移动
- 程序 卡塔_建筑钉卡塔
- 个人博客如何申请ICP备案
- 解决springboot无法访问此网站,localhost 拒绝了我们的连接请求的问题。
- MFC 利用小型数据库Access 少步惆 教你用VC开发
- UVA1428 Ping pong