mysql查询数据会不会锁表_mysql select是否会锁表 ?

mysql select是否会锁表 ?

有的人说mysql的 select 会锁表 ,有的人说 mysql 的查询不会锁表 。 其他他们都对,没有 ,但是很片面。

其实对于mysql的select 是否会锁表 ,这个完全取决于表采用的是什么存储引擎。

这里我就拿大家最熟悉的存储引擎INNODB 和MYISAM 来说明这个问题。

对于myisam的表select 是会锁定表的 ,会导致其他操作挂起,处于等待状态。 对于innodb的表select 是不会锁表的。其实这里使用到了快照。快照这里不作讨论。

下面是是我的佐证:

回话一:  select SQL_NO_CACHE * from tmp002  表 tmp002  有5618288 数据 存储引擎时INNODB  ,全部查询出来大约需要5min左右    回话二:  update tmp002  set num=6  where MreasonId in ('700098','301001' ) limit 10000  我们首先 执行以下 回话一的 语句 。 再执行回话二。

我们会发现回话2很快就执行了   update tmp002  set num=6  where MreasonId in ('700098','301001' ) limit 10000

受影响的行: 0 时间: 0.120s

在回话三种执行下 show full PROCESSLIST 。  没有发现任何锁定的现象。

修改表存储引擎:  alter table tmp002 ENGINE=MYISAM 受影响的行: 5618288 时间: 17.510s

同样是上面的例子

回话一:  select SQL_NO_CACHE * from tmp002  表 tmp002  有5618288 数据 存储引擎时INNODB  ,全部查询出来大约需要5min左右    回话二:  update tmp002  set num=6  where MreasonId in ('700098','301001' ) limit 10000

我们首先 执行以下 回话一的 语句 。 再执行回话二。  我们先回话一直处于执行状态 ,没有返回任何信息 。

在回话三种执行下 show full PROCESSLIST 。 13564441 root 192.168.53.41:53312 tempDB Query 2 Locked  update tmp002 set num=6 where MreasonId in ('700098','301001' ) limit 10000 13564671 root 192.168.53.41:53736 tempDB Query 4 Writing to net select SQL_NO_CACHE * from tmp002

回话13564441状态为 Locked ,等待锁的释放 。

综上所述,可以得到下面的结果。 对于myisam的表select 是会锁定表的 ,会导致其他操作挂起,处于等待状态。 对于innodb的表select 是不会锁表的。其实这里使用到了快照。快照这里不作讨论。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL乐观锁是一种常见的并发控制机制,常用于处理库存相关的业务场景。在这种场景下,经常有多个用户同时查询和修改库存数量,为了保证数据的准确性和一致性,可以采用乐观锁机制。 乐观锁的原理是,在进行数据更新操作前,先进行数据版本的判断。在库存表中,可以添加一个版本号字段,每次对库存进行修改时,版本号进行更新。当用户进行库存修改操作时,先查询当前库存数量以及对应的版本号,然后进行修改时,判断查询结果的版本号是否和当前库存表中版本号一致。若一致,则可以执行修改操作,同时更新版本号;若不一致,则说明数据已经被其他用户修改,需要进行相应的处理,如重新查询库存数量或提示用户无法进行修改操作。 在实际实现中,可以使用乐观锁的方式来避免库存并发修改带来的问题。例如,用户A和用户B同时查询到库存为10,并开始执行库存减1的操作。当用户A执行更新操作时,将版本号更新为1,并将库存减1,此时库存为9。而当用户B执行更新操作时,由于库存表中的版本号已变为1,而查询结果中的版本号仍未0,因此判断版本号不一致,这时用户B可以根据实际情况选择重新查询库存数量或进行其他操作。 乐观锁在处理库存并发修改时,能够有效地保障数据的准确性和一致性,避免了并发操作引起的问题。但需要注意的是,使用乐观锁机制时,要合理处理并发冲突,例如设置重试机制或采用其他的处理策略,以保证数据的正确性和业务的正常进行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值