(数据库十)数据库中的锁机制以及死锁产生的原因及解决办法

文章目录

  • 锁的分类
    • 根据锁粒度分类
    • 根据锁级别分类
  • 死锁
    • 死锁产生的第一种情况
      • 原因:事务之间对资源访问顺序的交替
      • 解决方法
    • 死锁产生的第二种情况
      • 原因:并发修改同一记录
      • 解决方法
    • 死锁的第三种情况
      • 原因:全表扫描
      • 解决方法

锁的分类

(数据库十)数据库中的锁机制以及死锁产生的原因及解决办法_第1张图片

根据锁粒度分类

按照锁的粒度,可以分为:行级锁、表级锁以及页级锁

1.行级锁
(1) 描述
行级锁是mysql中锁定粒度最小的一种锁。表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突,其加锁粒度最小,但加锁的开销也最大。行级锁分为共享锁和排他锁。
(2)特点
开销大,加锁慢,会出现死锁。发生锁冲突的概率最低,并发度也最高。
2. 表级锁
(1) 描述
表级锁是mysql中锁的粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分mysql引擎支持。最常使用的 MyISAM 与 InnoDB 都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)
(2)特点
开销小,加锁快,不会出现死锁。发生锁冲突的概率最高,并发度也最低。
3. 页级锁
(1) 描述
页级锁是 MySQL 中锁粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。因此,采取了折中的页级锁,一次锁定相邻的一组记录。BDB 支持页级锁。
(2)特点
开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

行级锁与死锁

MyISAM中是不会产生死锁的,因为MyISAM总是一次性获得所需的全部锁,要么全部满足,要么全部等待。而在InnoDB中,锁是逐步获得的,就造成了死锁的可能
在MySQL中,行级锁并不是直接锁记录,而是锁索引。索引分为主键索引和非主键索引两种,如果一条sql语句操作了主键索引,MySQL就会锁定这条主键索引;如果一条语句操作了非主键索引,MySQL会先锁定该非主键索引,再锁定相关的主键索引。 在UPDATE、DELETE操作时,MySQL不仅锁定 WHERE 条件扫描过的所有索引记录&

你可能感兴趣的:(数据库)