mysql锁机制
一、表锁(偏读):
偏向MyISAM存储引擎,开销小,加锁快;无死锁;锁定粒度大,发生锁冲突的概率最高,并发低。
-- 查看是否有表锁
show open tables;
-- 加表锁(读锁-共享锁、写锁)
lock table 表名 read, 表名 write;
-- 解锁
unlock tables;
MyISAM在执行查询语句(select)前,会自动给涉及的所有表加读锁,在执行增删改操作前,会自动给涉及的表加写锁。
mysql的表锁有两种模式:
表共享读锁
表独占写锁
对MyISAM表进行操作,会有以下情况:
1、对MyISAM表的读操作(加读锁),不会阻塞其他进程对同一表的读请求,但会阻塞对同一表的写请求。只有当读锁释放后,
才会执行其他进程的写操作。
2、对MyISAM表的写操作(加写锁),会阻塞其他进程对同一表的读和写操作,只有当写锁释放后,才会执行其他进程的读写操作。
简而言之,就是读锁会阻塞写,但是不会堵塞读。而写锁则会把读和写都堵塞。
表锁分析
-- 查看是否出现表锁
show open tables;
-- 查看表锁定次数与发生等待的次数
show status like 'table%';
结果:
Table_locks_immediate:产生表级锁定的次数,表示可以立即获取锁的查询次数。
Table_locks_waited:出现表级锁定争用而发生等待的次数,此值高则说明存在着较严重的表级锁争用情况;
二、行锁:
偏向InnoDB存储引擎,开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率最低,并发度也最高。
InnoDB与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:系统启动后到现在总共等待的次数;