【MySQL】锁

本文参考文章

  1. MySQL锁详解
  2. MySQL中的行级锁,表级锁,页级锁

MySQL锁的分类

锁类型概念优点缺点特点总结分类引擎支持
行级锁(row-level locking)锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁减少数据库操作的冲突加锁开销大开销大,加锁慢;易出现死锁;锁定粒度最低,发生锁冲突概览最小,并发度最高共享锁、排他锁InnoDB
表级锁(table-level locking)锁定粒度最大的一种锁,表示对当前操作的整张表加锁实现简单,资源消耗较少,被大部分MySQL引擎支持易发生锁冲突开销小,加锁快;不会出现死锁;锁定粒度大,易发生锁冲突,并发率低表共享读锁(共享锁);表独占写锁(排他锁)MYISAM,InnoDB ,BDB
页级锁(page-level locking)锁定粒度介于行级锁和表级锁之间,一次锁定相邻的一组记录--开销和加锁时间介于表锁和行锁之间;会出现死锁;锁定粒度介于行级和表级,并发度一般-BDB

引擎支持

MySQL默认引擎:5.1版本之前是MyISAM,之后是InnoDB

  1. MyISAM和MEMORY采用表级锁
  2. BDB采用页面锁或表级锁,默认为页面锁
  3. InnoDB支持行级锁和表级锁,默认为行级锁

InnoDB

  1. InnoDB行锁是通过给索引上的索引项加锁来实现
  2. 不同于MySQL,Oracle是通过在数据块中对相应数据行加锁来实现的
  3. 即 只有通过索引条件检索数据,InnoDB才使用行级锁,否则使用表级锁

行级锁与死锁

引擎

  1. MyISAM引擎不支持事务,它会一次性获得所需的全部锁,所以不会出现死锁,但由于每操作一次就会锁住整张表,容易导致性能低,并发不高
  2. InnoDB引擎支持事务,且使用行锁,锁是一步一步获得的,容易产生死锁。

    行级锁并不直接锁记录,而是锁索引

避免死锁常用方法

  1. 如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会。
  2. 同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率;
  3. 对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值