十、数据库锁
加锁是为了保证数据的一致性
一、按照锁粒度进行划分
缺点 | 优点 | ||
表锁 | 数据表进行锁定 |
|
|
页锁 | 数据页的粒度上进行锁定 |
|
|
行锁 | 行的粒度对数据进行锁定 |
|
|
- 每个层级的锁数量是有限制的,锁会占用内存空间,锁空间的大小是有限的
- 当某个层级的锁数量超过了这个层级的阈值时,就会进行锁升级
- 锁升级就是用更大粒度的锁替代多个更小粒度的锁
- 比如 InnoDB 中行锁升级为表锁,这样做的好处是占用的锁空间降低了,但同时数据的并发度也下降
二、数据库管理的角度对锁进行划分
共享锁 |
|
|
排它锁 |
|
|
意向锁 |
|
|
三、共享锁会发生死锁
- 当有多个事务对同一数据获得读锁的时候,可能会出现死锁的情况
- 相互等待相互不释放手上资源
四、程序员的角度对进行划分
乐观锁 |
|
悲观锁 |
|
- 乐观锁适合读操作多的场景,相对来说写的操作比较少。它的优点在于程序实现,不存在死锁问题,不过适用场景也会相对乐观,因为它阻止不了除了程序以外的数据库操作
- 悲观锁适合写操作多的场景,因为写的操作具有排它性。采用悲观锁的方式,可以在数据库层面阻止其他事务对该数据的操作权限,防止读 - 写和写 - 写的冲突。
五、MVCC
全称是 Multiversion Concurrency Control,中文翻译过来就是多版本并发控制技术。从名字中也能看出来,MVCC 是通过数据行的多个版本管理来实现数据库的并发控制,简单来说它的思想就是保存数据的历史版本。这样我们就可以通过比较版本号决定数据是否显示出来(具体的规则后面会介绍到),读取数据的时候不需要加锁也可以保证事务的隔离效果
快照读读取的是快照数据,不加锁的简单的 SELECT 都属于快照读
- 读写之间阻塞的问题,通过 MVCC 可以让读写互相不阻塞,即读不阻塞写,写不阻塞读,提升事务并发处理能力
- 降低了死锁的概率。MVCC 采用了乐观锁的方式,读取数据时并不需要加锁,对于写操作,也只锁定必要的行
- 解决一致性读的问题。一致性读也被称为快照读,当查询数据库在某个时间点的快照时,只能看到这个时间点之前事务提交更新的结果,而不能看到这个时间点之后事务提交的更新结果
InnoDB 中的 MVCC 实现
InnoDB 是如何存储记录的多个版本的。多版本对应 MVCC 前两个字母的释义:Multi Version
事务版本号 |
| ||||||||||
行记录的隐藏列 |
|
| |||||||||
Undo Log |
|
|
Read View 如何工作
- 多个事务对同一个行记录进行更新会产生多个历史快照
- 历史快照保存在 Undo Log 里
- 如果一个事务想要查询这个行记录,需要读取哪个版本的行记录?
- 需要用到 Read View 它帮我们解决了行的可见性问题
- Read View 保存了当前事务开启时所有活跃(还没有提交)的事务列表
- 换个角度你可以理解为 Read View 保存了不应该让这个事务看到的其他的事务 ID 列表
trx_ids | 系统当前正在活跃的事务 ID 集合 |
low_limit_id | 活跃的事务中最大的事务 ID |
up_limit_id | 活跃的事务中最小的事务 ID |
creator_trx_id | 创建这个 Read View 的事务 ID |
trx_ids 为 trx2、trx3、trx5 和 trx8 的集合,活跃的最大事务 ID(low_limit_id)为 trx8,活跃的最小事务 ID(up_limit_id)为 trx2
- 当前有事务 creator_trx_id 想要读取某个行记录,这个行记录的事务 ID 为 trx_id,那么会出现以下几种情况
- 如果 trx_id < 活跃的最小事务 ID(up_limit_id),也就是说这个行记录在这些活跃的事务创建之前就已经提交了,那么这个行记录对该事务是可见的
- 如果 trx_id > 活跃的最大事务 ID(low_limit_id),这说明该行记录在这些活跃的事务创建之后才创建,那么这个行记录对当前事务不可见
- 如果 up_limit_id < trx_id < low_limit_id,说明该行记录所在的事务 trx_id 在目前 creator_trx_id 这个事务创建的时候,可能还处于活跃的状态
- 因此需要在 trx_ids 集合中进行遍历,如果 trx_id 存在于 trx_ids 集合中,证明这个事务 trx_id 还处于活跃状态,不可见
- 否则,如果 trx_id 不存在于 trx_ids 集合中,证明事务 trx_id 已经提交了,该行记录可见
当查询一条记录的时候,系统如何通过多版本并发控制技术找到它
- 首先获取事务自己的版本号,也就是事务 ID
- 获取 Read View
- 查询得到的数据,然后与 Read View 中的事务版本号进行比较
- 如果不符合 ReadView 规则,就需要从 Undo Log 中获取历史快照
- 最后返回符合规则的数据
- InnoDB 中,MVCC 是通过 Undo Log + Read View 进行数据读取,Undo Log 保存了历史快照,而 Read View 规则帮我们判断当前版本的数据是否可见
- 在隔离级别为读已提交(Read Commit)时,一个事务中的每一次 SELECT 查询都会获取一次 Read View
- 当隔离级别为可重复读的时候,就避免了不可重复读,这是因为一个事务只在第一次 SELECT 的时候会获取一次 Read View,而后面所有的 SELECT 都会复用这个 Read View
InnoDB 如何解决幻读
记录锁 |
|
间隙锁(Gap Locking) |
|
Next-Key 锁 |
|

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
移动端开发的屏幕、图像、字体与布局的兼容适配
关注公众号前端开发博客,回复“加群” 加入我们一起学习,天天进步 作者:ChokCoco https://www.cnblogs.com/coco1s/p/11463599.html 本文是内部的一次分享沉淀,偏向基础但是涉及了一些有意思的细节,文笔有限,才疏学浅,文中若有不正之处,万望告知。 前端的一大工作内容就是去兼容页面在不同内核的浏览器,不同的设备,不同的分辨率下的行为,使页面的能正常工作在各种各样的宿主环境当中。 而本文的主题 --移动端开发的兼容适配与性能优化,就是希望能从一些常见的移动端开发问题出发,理清 Web 移动端开发的前前后后,一些技术的发展过程,一些问题的优化手段以及给出一些常见的兼容性问题的解决方案。 什么是响应式设计 首先先聊聊响应式设计,这个与移动端开发有着密切的联系。 响应式设计即是 RWD,Responsive Web Design。 这里百度或者谷歌一下会有各种各样的答案。这里一段摘自知乎上我觉得很棒的一个答案:什么是响应式布局设计?(地址:https://www.zhihu.com/question/20976405) 根据维基百科及其参考文献,理...
- 下一篇
数据库:储存过程与触发器
储存过程: 存储过程是存储在数据库目录中的一段声明性SQL语句。 存储过程是数据库中的一个重要对象,用户通过指定存储过程的名字并给出参数来执行它。 存储过程的优点: ① 增强了SQL语句的功能和灵活性; ② 不需要反复建立一系列处理步骤,保证了数据的完整性; ③ 降低了网络的通信量,客户端调用存储过程只需要传存储过程名和相关参数即可,与传输SQL语 句相比自然数据量少了很多; ④ 增强了使用的安全性,通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而 保证数据的安全; ⑤ 可以实现集中控制,当规则发生改变时,只需要修改存储过程就可以啦; 存储过程的缺点: ① 调试不是很方便; ② 可能没有创建存储过程的权利; ③ 重新编译问题; ④ 移植性问题; 存储过程的分类: 1)系统存储过程: 以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作。 2)本地存储过程: 用户创建的存储过程是由用户创建并完成某一特定功能的存储过程,事实上一般所说的存储过程就是指本地存储过程。 3)临时存储过程: ①局部临时存储过程 以井字号(#)作为其名称的第一个字符,则该存储过程将成为一个存...
相关文章
文章评论
共有0条评论来说两句吧...