一、行锁
通过检查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:系统启动后到现在总共等待的次数
对于这5个状态变量,比较重要的主要是:
Innodb_row_lock_time_avg (等待平均时长)
Innodb_row_lock_waits (等待总次数)
Innodb_row_lock_time(等待总时长)
尤其是当等待次数很高,而且每次等待时长也不小的时候,我们就需要分析系统 中为什么会有如此多的等待,然后根据分析结果着手制定优化计划。
二、死锁
设置事务级为mysql默认的级别:
set tx_isolation='repeatable-read';
Session_1执行:
select * from account where id=1 for update;
Session_2执行:
select * from account where id=2 for update;
Session_1执行:
select * from account where id=2 for update;
Session_2执行:
select * from account where id=1 for update;
多数情况mysql可以自动检测死锁并回滚产生死锁的那个事务,但是有些情况 mysql没法自动检测死锁
查看近期死锁日志信息:
show engine innodb status\G;