innodb行级锁

1.SELECT … FROM

是一个快照读,通过读取数据库的一个快照,不会加任何锁,除非将隔离级别设置成了 SERIALIZABLE 。

2.SELECT … FROM … LOCK IN SHARE MODE

在所有索引扫描范围的索引记录上加上共享的next key锁;如果是唯一索引,只需要在相应记录上加index record lock。这些被共享lock住的行无法进行update/delete。
允许其它事务对这些记录再加SHARE锁
如果没有使用到索引,则锁住全表(表级的排他锁),无法进行insert/update/delete。

3.SELECT … FROM … FOR UPDATE

在所有索引扫描范围的索引记录上加上排他的next key锁。如果是唯一索引,只需要在相应记录上加index record lock。
如果没有利用到索引将锁住全表(表级的排他锁),其它事务无法进行insert/update/delete操作。

  1. UPDATE … WHERE …

在所有索引扫描范围的索引记录上加上排他的next key锁。如果是唯一索引,只需要在相应记录上加index record lock。
如果没有利用到索引将锁住全表(表级的排他锁),其它事务无法进行其他的insert/update/delete操作。;

  1. DELETE FROM … WHERE …

语句在所有索引扫描范围的索引记录上加上排他的next key锁。如果是唯一索引,只需要在相应记录上加index record lock。
如果没有利用到索引将锁住全表(表级的排他锁),其它事务无法进行其它的insert/update/delete操作。

  1. INSERT

在插入的记录上加一把排他锁,这个锁是一个index-record lock,并不是next-key 锁,因此就没有gap 锁,他将不会阻止其他会话在该条记录之前的gap插入记录。
for update (将所有查询到的数据加上排它锁)

show status like 'innodb_row_lock%'; 展示行锁参数

优化建议:

1.尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁

2.合理设计索引,尽量缩小锁的范围

3.尽可能较少检索条件,避免间隙锁

4.尽量控制事务大小,减少锁定资源量和时间长度

5.尽可能低级别事务隔离
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值