myisam 的读写锁(表锁)

lock table emp read;
lock table emp write;

myisam 是写锁调度优于读锁调度,所以 mysiam 要偏读(因为写会阻塞其他线程对当前表的任何操作)

myisam 执行 select 时会给所有涉及的表增加读锁。执行增删改时会给所有涉及到的表增加写锁

表读锁,当前 session 只能读当前表,对其他表任何操作都做不了,其他 session 能做任何操作,只是对有读锁的表的增删改会阻塞

表写锁,当前 session 只能对当前表做增删改查,对其他表任何操作都做不了,其他 session 对有写锁的表的任何操作都会堵塞,但是对其他的表可以做任何操作

show open tables; --查看哪些表被锁了
show status like 'table%'; --分析表的锁定状况

innodb 的读写锁(行锁)

session1 更新某一行时,且未提交。session2 读到的是旧数据。直到 ession1 提交。session2 才能读到新数据

session1 更新某一行时,且未提交。当 session2 同时也更新这一行时,阻塞。直到 ession1 提交。session2 才能更新完成。注意:session2 更新其他行的数据不受影响

注意

innode 引擎默认是行锁。但是出现以下情况的时候,行锁还是会变成表锁

即:更新时 where 后面的条件没有使用上索引。包括字段上本身没有索引或者有索引但是 sql 写的不严谨导致索引失效,此时即使是 innodb 引擎它在更新的时候还是会锁住整张表

行锁的状态查看命令

show status like 'innodb_row_lock%'
--出现的参数依次往下分别是:
--当前正在等待的锁的数量
--从服务器启动到现在等待锁的总的时间长度
--每次等待所花的平均时间
--等待的最长的一次时间
--服务启动到现在总共等待锁的次数