mysql执行一条语句会加锁吗_Mysql 执行 select 查询语句的时候 会自动加锁吗?

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值