Mysql 执行 select 查询语句的时候 会自动加锁吗?
Mysql 执行 select 语句会根据表的引擎的不同而自动加锁吗?
或者说有没有什么文档是介绍 Mysql 查询时内部的锁的机制 (不是手动加锁)
更新一下问题, 举例子:
myisam 如果先在 session1 中执行耗时长的 select 查询 (非事务), 然后 session2 中执行 update 这个被查询的表的数据, 会立即执行吗? 还是要等到 session1 查询结束后才会执行?
做个实验
select * from pre_common_member
查询一下比较大的表
update pre_common_member set password=1234568 where uid=4117593
同时在另一个 session 更新这个表|239|root|localhost|bbsdata|Query|10|Sendingdata|select*frompre_common_member|
|410|root|localhost|bbsdata|Query|2|Waitingfortable levellock|update pre_common_membersetpassword=1234568whereuid=4117593
上面时两个语句执行中执行 show processlist 显示的结果, update 在等待 table level locking
自己查了半天, 找到的最贴近的文档内容:MySQLgrants table write locksasfollows:
Ifthere arenolocks on the table,put a writelockon it.
Otherwise,put thelockrequestinthe writelockqueue.
MySQLgrants table read locksasfollows:
Ifthere arenowrite locks on the table,put a readlockon it.
Otherwise,put thelockrequestinthe readlockqueue.
结论
因为 select 是读取操作, 所以会加 read lock(我自己推理得出的, 没有找到官方说法). 上面的实验中, update 操作要等待 select 的锁释放, 才能加 write lock. 所以会卡住直到 select 结束. 而同时的 select 操作则不需要等待, 因为文档内说明了 read lock 的上锁条件为
只要没有 write lock
就可以.
决定放弃使用 myisam 表了, 感觉 mysql 官方在 5.5 以上都已经设置 Innodb 为默认引擎了, 我也没必要使用 myisam 了.
来源: https://segmentfault.com/q/1010000010645683