扫码关注微信公众号

回复“面试手册”,获取本站PDF版

回复“简历”,获取高质量简历模板

回复“加群”,加入程序员交流群

回复“电子书”,获取程序员类电子书

当前位置: 计算机基础 > MySQL高频面试题 > 29.什么是死锁?如何避免?

死锁是指两个或者两个以上进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象。在MySQL中,MyISAM是一次获得所需的全部锁,要么全部满足,要么等待,所以不会出现死锁。在InnoDB存储引擎中,除了单个SQL组成的事务外,锁都是逐步获得的,所以存在死锁问题。

如何避免MySQL发生死锁或锁冲突:

  • 如果不同的程序并发存取多个表,尽量以相同的顺序访问表。
  • 在程序以批量方式处理数据的时候,如果已经对数据排序,尽量保证每个线程按照固定的顺序来处理记录。
  • 在事务中,如果需要更新记录,应直接申请足够级别的排他锁,而不应该先申请共享锁,更新时在申请排他锁,因为在当前用户申请排他锁时,其他事务可能已经获得了相同记录的共享锁,从而造成锁冲突或者死锁。
  • 尽量使用较低的隔离级别
  • 尽量使用索引访问数据,使加锁更加准确,从而减少锁冲突的机会
  • 合理选择事务的大小,小事务发生锁冲突的概率更低
  • 尽量用相等的条件访问数据,可以避免Next-Key锁对并发插入的影响。
  • 不要申请超过实际需要的锁级别,查询时尽量不要显示加锁
  • 对于一些特定的事务,可以表锁来提高处理速度或减少死锁的概率。

点击面试手册,获取本站面试手册PDF完整版