概述
以下资料是网络收集外加部分个人理解,当前数据库版本:MySQL Ver 14.14 Distrib 5.7.11, for Win64 (x86_64)。
记得以前,当出现:ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction,要解决是一件麻烦的事情。特别是当一个SQL执行完了,但未COMMIT,后面的SQL想要执行就是被锁,超时后结束,DBA光从数据库无法着手找出源头是哪个SQL锁住了。有时候看看 show engine innodb status, 并结合 show full processlist 能暂时解决问题,但一直不能精确定位。
在5.5中,information_schema 库中增加了三个关于锁的表(MEMORY引擎)
Innodb锁
Innodb存储引擎实现了如下2种标准的行级锁:
共享锁(S lock),允许事务读取一行数据,select语句后加lock in share mode。
排它锁(X lock),允许事务删除或者更新一行数据,select语句后加for update。
当一个事务获取了行r的共享锁,那么另外一个事务也可以立即获取行r的共享锁,因为读取并未改变行r的数据,这种情况就是锁兼容。但是如果有事务想获得行r的排它锁,则它必须等待事务释放行r上的共享锁—这种情况就是锁不兼容,二者兼容性如下表格所示:
X 排它锁
S 共享锁
X 排它锁
冲突
冲突
S 共享锁
冲突