MySQL表锁行锁

对比

MySQL Innodb支持行锁,而MyISAM只支持表锁。这两种主要是粒度的差别。锁是事务的关键保证。

  • 表锁:
    开销小实现简单,加锁快;不会出现死锁;锁定力度大,发生锁冲突概率高,并发度最低
  • 行锁:
    开销大实现复杂,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高

    当然还有介于两者之间的页锁。性质也居中。

表锁

MySQL的表级锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)
一般是SELECT加共享锁,而INSERT, UPDATE, DELETE加独占锁

行锁

行锁是根据索引实现的
1.行锁必须有索引才能实现,否则会自动锁全表,那么就不是行锁了。
2.两个事务不能锁同一个索引。

例如:

-- 事务A先执行:  
select math from zje where math>60 for update;  

-- 事务B再执行:  
select math from zje where math<60 for update

都是使用了math索引,A先的话,事务B会被阻塞,事务B换成其他索引就不会阻塞,都是还是不能有重复交接的行,不然还是阻塞。

又比如商品秒杀或者抢红包的时候,对库存数量做如下操作

UPDATE t_seckill SET num = num - 1 WHERE id = 10 AND num > 0

id作为索引,不同终端的事务都对其修改的话,因为是同一个索引,同一条记录,这里都是串行的。大量阻塞。这也是高并发需要优化的重点。

参考

  1. MySQL学习之——锁(行锁、表锁、页锁、乐观锁、悲观锁等)
  2. 行锁与表锁详解

  转载请注明: Chgl16 MySQL表锁行锁

 上一篇
Spring声明式事务 Spring声明式事务
Spring声明式事务 事务是对于多个SQL执行才有必要,一个就算了。推荐使用第三种@Transactional,毕竟事务声明是很严谨重要的点。这个可读性等更好。 注解声明配置方式spring-service.xml <?xm
2019-07-14
下一篇 
MySQL中文乱码 MySQL中文乱码
插入乱码即便数据库和表如下utf8编码配置 CREATE DATABASE `db_name` DEFAULT CHARACTER SET utf8; CREATE TABLE `tb_name` (...) ENGINE=InnoDB A
2019-07-11
  目录