java八股文面试[数据库]——MySQL死锁的原因和处理方法

这篇具有很好参考价值的文章主要介绍了java八股文面试[数据库]——MySQL死锁的原因和处理方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1) 表的死锁

产生原因:

用户A访问表A(锁住了表A),然后又访问表B;另一个用户B访问表B(锁住了表B),然后企图访问表A;这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B才能继续,同样用户B要等用户A释放表A才能继续,这就死锁就产生了。

用户A--》A表(表锁)--》B表(表锁)

用户B--》B表(表锁)--》A表(表锁)

解决方案

这种死锁比较常见,是由于程序的BUG产生的,除了调整的程序的逻辑没有其它的办法

仔细分析程序的逻辑,对于数据库的多表操作时,尽量按照相同的顺序进行处理,尽量避免同时锁定两个资源,如操作A和B两张表时,总是按先A后B的顺序处理, 必须同时锁定两个资源时,要保证在任何时刻都应该按照相同的顺序来锁定资源。

2) 行级锁死锁

产生原因1:

如果在事务中执行了一条没有索引条件的查询,引发全表扫描,把行级锁上升为全表记录锁定(等价于表级锁),多个这样的事务执行后,就很容易产生死锁和阻塞,最终应用系统会越来越慢,发生阻塞或死锁。

解决方案:

SQL语句中不要使用太复杂的关联多表的查询;使用explain“执行计划"对SQL语句进行分析,对于有全表扫描全表锁定的SQL语句,建立相应的索引进行优化。

产生原因2:

- 两个事务分别想拿到对方持有的锁,互相等待,于是产生死锁

java八股文面试[数据库]——MySQL死锁的原因和处理方法,java八股文【数据库】,数据库,java,面试

产生原因3:

每个事务只有一个SQL,但是有些情况还是会发生死锁.

1. 事务1,从name索引出发 , 读到的[hdc, 1],  [hdc, 6]均满足条件, 不仅会加name索引上的记录X锁, 而且会加聚簇索引上的记录X锁, 加锁顺序为先[1,hdc,100], 后[6,hdc,10]
2. 事务2,从pubtime索引出发,[10,6],[100,1]均满足过滤条件,同样也会加聚簇索引上的记录X锁,加锁顺序为[6,hdc,10],后[1,hdc,100]。
3. 但是加锁时发现跟事务1的加锁顺序正好相反,两个Session恰好都持有了第一把锁,请求加第二把锁,死锁就发生了。

java八股文面试[数据库]——MySQL死锁的原因和处理方法,java八股文【数据库】,数据库,java,面试

解决方案:

 如上面的原因2和原因3,  对索引加锁顺序的不一致很可能会导致死锁,所以如果可以,尽量以相同的顺序来访问索引记录和表。在程序以批量方式处理数据的时候,如果事先对数据排序,保证每个线程按固定的顺序来处理记录,也可以大大降低出现死锁的可能;

如何避免死锁

为了避免死锁,可以采取以下措施:

1 保持锁的顺序一致。在多个事务请求资源的情况下,要保持锁的请求顺序一致,这可以避免死锁的发生。

2 尽量缩短事务的持有时间。如果事务持有锁的时间过长,会增加死锁的风险。因此,在处理事务时,应尽量缩短事务的持有时间,尽快释放锁。

3 尽量减少事务的嵌套。如果事务嵌套层数过多,会增加死锁的风险。因此,在编写事务时,应尽量减少事务的嵌套层数,避免死锁的发生。

4 使用超时机制。如果一个事务等待锁的时间过长,可以使用超时机制来终止该事务,从而避免死锁的发生。

如何解决死锁

如果避免死锁失败,可能需要采取以下措施来解决死锁:

1 检测死锁。数据库管理系统通常提供死锁检测机制,可以检测出死锁的发生,并且可以中止其中一个事务,从而解除死锁。

2 优化锁的使用。如果死锁的发生频率较高,可能需要重新设计数据库架构,优化锁的使用,从而降低死锁的发生率。

3 重构事务。如果死锁的发生频率较高,可能需要重构事务,重新设计事务的逻辑,从而避免死锁的发生。

4 增加资源。如果死锁的发生频率较高,可能需要增加资源,例如增加服务器的处理能力或增加数据库的缓存空间,从而降低死锁的发生率。

 innoDB死锁检测原理

innoDB 检测死锁通过等待图来检测死锁,如果等待图有回路,则表示有循环依赖,相互等待的情况,则表示有死锁。

等待图需要通过2张表来构建,当前锁的信息表 和 当前事务等待表

  1. 当前锁的信息表
select * from performance_schema.data_locks;

java八股文面试[数据库]——MySQL死锁的原因和处理方法,java八股文【数据库】,数据库,java,面试

这个图可以看出,线程 61 获得了id = 1 的排他锁,而 线程 63 获得了 id = 100 的排他锁。

  1. 当前事务等待表
select * from performance_schema.data_lock_waits;

java八股文面试[数据库]——MySQL死锁的原因和处理方法,java八股文【数据库】,数据库,java,面试

这个图可以看出,在线程 63(也就是获得了 id = 100 排他锁的线程)在尝试获取 id = 1 时 被 block 了,block 他的线程是线程 61,因为线程 61 正在获得 id = 1 的排他锁。

如果在继续执行线程 61 尝试获取 id = 100 的记录,会获取如下的结果

java八股文面试[数据库]——MySQL死锁的原因和处理方法,java八股文【数据库】,数据库,java,面试

通过这两张表, innoDB 可以绘出如下的图

  1. 首先有多少个事务,就有多少个点,在这个例子里,有2个事务,线程 61 和 63
  2. 线程 61 在等待 线程 63,尝试获取 id = 100 的记录,所以 61 - 63 有一条边
  3. 线程 63 在等待 线程 61,尝试获取 id = 1 的记录,所以 63 - 61 有一条边

最后判断图中是否有回路,如果有回路,则认为有死锁,若发现有死锁,回滚 undo 量最小的记录的事务。

java八股文面试[数据库]——MySQL死锁的原因和处理方法,java八股文【数据库】,数据库,java,面试

知识来源:马士兵教育

百度安全验证

【数据库】数据库死锁 - 知乎文章来源地址https://www.toymoban.com/news/detail-698108.html

到了这里,关于java八股文面试[数据库]——MySQL死锁的原因和处理方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java八股文面试[数据库]——可重复读怎么实现的(MVCC)

    可重复读(repeatable read)定义: 一个事务执行过程中看到的数据,总是 跟这个事务 在 启动时 看到的数据是一致的。 MVCC MVCC, 多版本并发控制 , 用于实现 读已提交 和 可重复读 隔离级别。 MVCC的核心就是 Undo log多版本链 + Read view ,“MV”就是通过 Undo log来保存数据的历史版

    2024年02月09日
    浏览(36)
  • java八股文面试[数据库]——B树和B+树的区别

    B树是一种树状数据结构,它能够存储数据、对其进行排序并允许以 O(logn) 的时间复杂度进行查找、顺序读取、插入和删除等操作。 B树中允许一个结点中包含多个key,可以是3个、4个、5个甚至更多,并不确定,需要看具体的实现。现在我们选 择一个参数M,来构造一个B树,我

    2024年02月09日
    浏览(50)
  • 面试八股文Mysql:(2)数据库调优

    数据库优化在提升系统性能是很重要的一个方面,不管是MySQL还是MongoDB还是其它的数据库。 SQL优化在提升系统性能中是成本最低 优化效果最明显的途径,可以让 吞吐量更大,响应速度更快 。如果你的团队在SQL优化这方面搞得很优秀,对你们整个大型系统可用性方面无疑是一

    2024年02月13日
    浏览(40)
  • 面试数据库八股文五问五答第四期

    作者:程序员小白条,个人博客 相信看了本文后,对你的面试是有一定帮助的! ⭐点赞⭐收藏⭐不迷路!⭐ 1)什么情况下 mysql 会索引失效? 不使用索引列进行查询:当查询条件不包含索引列时,MySQL无法使用索引进行快速查找,而会进行全表扫描,导致索引失效。 使用函

    2024年02月04日
    浏览(33)
  • JAVA-软开-常见八股文(2)-数据库相关

    1 Drop Delete Truncate三者之间的区别和联系 drop删除整张表,包括表结构和表数据。用法 drop table 表名 truncate表示清空数据,不会删除表结构。truncate table 表名 delete表示删除数据,不会删除表结构。delete from 表名 where 列名 = 值, 那么,truncate和delete的区别:             trunca

    2024年02月06日
    浏览(41)
  • 计算机复试面试基础知识(八股文)(数据库、数据结构、操作系统、计网、机组等)

    数据库绪论 1、简述三层模式、两级映射,分别有什么作用? 模式(逻辑模式):是数据库中全体数据的逻辑结构和特征的描述,是数据库系统模式结构的中间层,即不涉及数据的物理存储细节,也与具体应用程序开发工具语言无关。 外模式(用户模式):是用户能看见和使

    2023年04月09日
    浏览(103)
  • java八股文面试[数据结构]——集合框架

    Java集合类主要由两个根接口Collection和Map派生出来的。 Collection派生出了三个子接口: Map接口派生: Map代表的是存储key-value对的集合,可根据元素的key来访问value。  因此Java集合大致也可分成 List、Set、Queue、Map四种接口体系 。 List代表了有序可重复集合,可直接根据元素的索

    2024年02月11日
    浏览(36)
  • java八股文面试[数据结构]——HashMap扩容优化

         知识来源: 【2023年面试】HashMap在扩容上做了哪些优化_哔哩哔哩_bilibili  

    2024年02月11日
    浏览(34)
  • java八股文面试[数据结构]——ArrayList和LinkedList区别

      ArrayList和LinkedList的异同 二者的线程都不安全,相对线程安全的Vector,执行效率高。此外,ArrayList时实现了基于动态数组的数据结构,LinkedList基于链表的数据结构,对于随机访问get和set,ArrayList觉得优于LinkedList比较占优势,因为LinledList要移动指针。对于新增和删除操作add

    2024年02月11日
    浏览(42)
  • Java 面试八股文

    参考: 2023年 Java 面试八股文(20w字)_json解析失败_leader_song的博客-CSDN博客

    2024年02月13日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包