电子商务网站加密,河北省建设监理协会网站,微信公众平台开发者文档,wordpress免费相册行级锁#xff0c;每次操作锁住对应的行数据。锁定粒度最小#xff0c;发生锁冲突的概率最低#xff0c;并发度最高。
应用在InnoDB存储引擎中。InnoDB的数据是基于索引组织的#xff0c;行锁是通过对索引上的索引项加锁来实现的#xff0c;而不是对记录加的锁。
对于行…
行级锁每次操作锁住对应的行数据。锁定粒度最小发生锁冲突的概率最低并发度最高。
应用在InnoDB存储引擎中。InnoDB的数据是基于索引组织的行锁是通过对索引上的索引项加锁来实现的而不是对记录加的锁。
对于行级锁主要分为以下三类
1.行锁Record Lock锁定单个行记录的锁防止其他事务对此行进行update和delete。在RC、RR隔离级别下都支持。 2. 间隙锁Gap Lock锁定索引记录间隙不含该记录确保索引记录间隙不变防止其他事务在这个间隙进行insert产生幻读。在RR隔离级别下都支持。 3.临键锁Next-Key Lock行锁和间隙锁组合同时锁住数据并锁住数据前面的间隙Gap。在RR隔离级别下支持。 一、表级锁、行级锁、页级锁
数据库锁定机制简单来说就是数据库为了保证数据的一致性而使各种共享资源在被并发访问变得有序所设计的一种规则。
MySQL数据库由于其自身架构的特点存在多种数据存储引擎每种存储引擎的锁定机制都是为各自所面对的特定场景而优化设计所以各存储引擎的锁定机制也有较大区别。
MySQL各存储引擎使用了三种类型级别的锁定机制表级锁定行级锁定和页级锁定。
1、表级锁
表级别的锁定是MySQL各存储引擎中最大颗粒度的锁定机制。该锁定机制最大的特点是实现逻辑非常简单带来的系统负面影响最小。所以获取锁和释放锁的速度很快。
当然锁定颗粒度大所带来最大的负面影响就是出现锁定资源争用的概率也会最高致使并发度大打折扣。
使用表级锁定的主要是MyISAMMEMORYCSV等一些非事务性存储引擎。
2、行级锁
行级锁定最大的特点就是锁定对象的颗粒度很小由于锁定颗粒度很小所以发生锁定资源争用的概率也最小能够给予应用程序尽可能大的并发处理能力而提高一些需要高并发应用系统的整体性能。
虽然能够在并发处理能力上面有较大的优势但是行级锁定也因此带来了不少弊端。
由于锁定资源的颗粒度很小所以每次获取锁和释放锁需要做的事情也更多带来的消耗自然也就更大了。此外行级锁定也最容易发生死锁。
使用行级锁定的主要是InnoDB存储引擎。
3、页级锁
页级锁定是MySQL中比较独特的一种锁定级别。页级锁定的特点是锁定颗粒度介于行级锁定与表级锁之间所以获取锁定所需要的资源开销以及所能提供的并发处理能力也同样是介于上面二者之间。
使用页级锁定的主要是BerkeleyDB存储引擎。
4、总结
总的来说MySQL这3种锁的特性可大致归纳如下
表级锁开销小加锁快不会出现死锁锁定粒度大发生锁冲突的概率最高并发度最低行级锁开销大加锁慢会出现死锁锁定粒度最小发生锁冲突的概率最低并发度也最高页面锁开销和加锁时间界于表锁和行锁之间会出现死锁锁定粒度界于表锁和行锁之间并发度一般。
二、临键锁
1、临键锁Next-Key Locks
Next-key锁是记录锁和间隙锁的组合它指的是加在某条记录以及这条记录前面间隙上的锁。
也可以理解为一种特殊的间隙锁。通过临建锁可以解决幻读的问题。 每个数据行上的非唯一索引列上都会存在一把临键锁当某个事务持有该数据行的临键锁时会锁住一段左开右闭区间的数据。需要强调的一点是InnoDB 中行级锁是基于索引实现的临键锁只与非唯一索引列有关在唯一索引列包括主键列上不存在临键锁。
查询规则 唯一索引等值查询 当查询的记录存在 临键锁 会退化成行锁 当查询的记录不存在临键锁会退化成间隙锁 非唯一索引等值查询 当查询的记录存在会加 临键锁和 间隙锁两把锁 当查询的记录不存在只会加 临键锁然后退化为间隙锁 非唯一索引和主键索引的范围查询的区别 唯一索引在满足条件时 临键锁 退化为间隙锁和记录锁 非唯一索引范围查询 临键锁不会退化 为间隙锁和记录锁
在使用时要注意 在执行 update / delete / select for update 语句时一定要检查语句是否走了索引避免全表扫描 Delete 时尽量使用主键 ID唯一索引 删除 查询时尽量使用唯一索引进行查询锁定范围较小