mysql表锁、行锁分析

给表加锁、解锁

lock table table1 read(write),table2 read(write),...
unlock tables;

查看哪些表被锁

show open tables ;

如何分析表锁定

可以通过检查 table_locks_waited 和 table_locks_immediate 两个状态变量来分析系统上的表锁定。
这两个状态变量记录了Mysql表级锁定的情况,两个变量说明如下:

  • table_locks_immediate:产生表级锁定的次数,表示可以立即获取锁的查询次数,每立即获取锁,值加1;
  • table_locks_waited:出现表级锁定争用而发生等待的次数(不能立即获取锁的次数),此值高则说明存在着较严重的表级锁争用情况;

Myisam的读写锁调度是写优先,这也是Myisam不适合做写为主的表的引擎。因为写锁后,其他线程不能做任何操作,大量的更新会使查询很难得到锁,从而造成永远阻塞。

Myisam在执行查询语句(select)前,会自动给涉及的所有表加读锁,在执行增删改操作前,会自动给涉及的表加写锁。
Mysql的表级锁有两种:

  • 表共享锁(读锁)(table read lock)
  • 表排它锁/独占锁(写锁)(table write lock)

对Myisam表进行操作,会有以下情况:

  1. 对Myisam表的读操作(加读锁),不会阻塞其他进程对同一张表的读请求,但会阻塞对同一张表的写请求。只有当读锁释放后,才会执行其他进程的写操作。
  2. 对Myisam表的写操作(加写锁),会阻塞其他进程对同一张表的读和写操作,只有当写锁释放后,才会执行其他进程的读写操作。

读锁会阻塞写,但是不会阻塞读;而写锁则会把读和写都阻塞。

分析行锁定

如何分析行锁定
通过检查innodb_row_lock状态变量来分析系统上的行锁的争夺情况。

show status like 'innodb_row_lock%';

状态说明:
innodb_row_lock_current_waits:当前正在等待锁定的数量;
innodb_row_lock_time:从系统启动到现在锁定总时间长度;
innodb_row_lock_time_avg:每次等待所花平均时间;
innodb_row_lock_time_max:从系统启动到现在等待最长的一次所花时间;
innodb_row_lock_waits:系统启动后到现在总共等待的次数;

  • 行锁偏向Innodb存储引擎,开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
  • Innodb与Myisam最大的不同有两点:一是支持事务(TRANSACTION);二是采用了行级锁
  • 由于行锁支持事务,所以必须遵守事务的ACID属性
  • 索引使用不当,会导致行锁升级为表锁
  • 行锁优化
  1. 尽可能让所有数据检索都通过索引来完成,避免无索引行或索引失效导致行锁升级为表锁。
  2. 合理设计索引,尽量缩小锁的范围。
  3. 尽可能减少或使用合理的检索范围,免间隙锁带来的性能下降。
  4. 尽可能减少事务的粒度,比如控制事务大小,从而减少锁定资源量和时间长度,从而减少锁的竞争等,提高性能。
  5. 尽可能低级别事务隔离,隔离级别越高,并发的处理能力越低。

什么是间隙锁?
 
当我们使用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录,叫做“间隙锁(GAP)”;InnoDB也会对这个“间隙”加锁,这种机制就是所谓的间隙锁(Next-Key锁)。
 
间隙锁的危害
 
因为Query执行过程中通过范围查找的话,它会锁定整个范围内所有的索引键值,即使这个键值并不存在。
 
间隙锁有一个比较致命的锁点,就是当锁定一个范围键值之后,即使某些不存在的键值也会被无辜的锁定,而造成锁定的时候无法插入锁定键值范围内的任何数据。在某些场景下这可能会对性能造成很大的危害。

InnoDB存储引擎由于实现了行级锁定,虽然在锁定机制的实现方面所带来的性能损耗可能比表锁定要更高一些,但是在整体并发处理能力方面要远远优于MyISAM的表级锁定。当系统并发量较高的时候,InnoDB的整体性能相对MyISAM会有比较明显的优势。

但是,InnoDB的行级锁定同样也有其脆弱的一面,当我们使用不当的时候,可能会让InnoDB的整体性能表现不仅不能比MyISAM高,甚至可能会更差。

页锁
 
开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

参考:
https://www.bilibili.com/video/BV12b411K7Zu?p=240&spm_id_from=pageDriver
https://blog.csdn.net/weixin_34107739/article/details/88906007


版权声明:本文为wanghailan1818原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。