锁
myisam 的读写锁(表锁)
lock table emp read; |
myisam 是写锁调度优于读锁调度,所以 mysiam 要偏读(因为写会阻塞其他线程对当前表的任何操作)
myisam 执行 select 时会给所有涉及的表增加读锁。执行增删改时会给所有涉及到的表增加写锁
表读锁,当前 session 只能读当前表,对其他表任何操作都做不了,其他 session 能做任何操作,只是对有读锁的表的增删改会阻塞
表写锁,当前 session 只能对当前表做增删改查,对其他表任何操作都做不了,其他 session 对有写锁的表的任何操作都会堵塞,但是对其他的表可以做任何操作
show open tables; --查看哪些表被锁了 |
innodb 的读写锁(行锁)
session1 更新某一行时,且未提交。session2 读到的是旧数据。直到 ession1 提交。session2 才能读到新数据
session1 更新某一行时,且未提交。当 session2 同时也更新这一行时,阻塞。直到 ession1 提交。session2 才能更新完成。注意:session2 更新其他行的数据不受影响
注意
innode 引擎默认是行锁。但是出现以下情况的时候,行锁还是会变成表锁
即:更新时 where 后面的条件没有使用上索引。包括字段上本身没有索引或者有索引但是 sql 写的不严谨导致索引失效,此时即使是 innodb 引擎它在更新的时候还是会锁住整张表
行锁的状态查看命令
show status like 'innodb_row_lock%' |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment