mysql数据库中的锁

MySQL InnoDB支持三种行锁定方式

1)行锁(Record Lock):锁直接加在索引记录上面,锁住的是key。如果是主键索引则锁住主键key, 如果是非主键索引,则先锁住非主键索引key, 再锁住主键key, 如果没有索引,则锁全表.
2)间隙锁(Gap Lock):锁定索引记录间隙,确保索引记录的间隙不变。间隙锁是针对事务隔离级别为可重复读或以上级别而定的。 加后码锁的时候,并没有锁住间隙两端的记录,那么两端的记录是可以更新的,但是如果更新两端的记录会影响到间隙锁,那么操作会被挂起,等待间隙锁释放

3)Next-Key Lock :行锁和间隙锁组合起来就叫Next-Key Lock。对于InnoDB中,更新非唯一索引对应的记录,会加上Next-Key Lock。如果更新记录为空,就不能加记录锁,只能加间隙锁。

锁选择

1)如果更新条件没有走索引,例如执行”update from t1 set v2=0 where v2=5;” ,其中v2不是索引,此时会进行全表扫描,扫表的时候,要阻止其他任何的更新操作,所以上升为表锁。
2)如果更新条件为索引字段,但是并非唯一索引(包括主键索引),例如执行“update from t1 set v2=0 where v1=9;” 其中, v1是非主键索引, 那么此时更新会使用Next-Key Lock。使用Next-Key Lock的原因:
    a)首先要保证在符合条件的记录上加上排他锁,会锁定当前非唯一索引和对应的主键索引的值;
    b)还要保证锁定的区间不能插入新的数据。
3)如果更新条件为唯一索引,则使用Record Lock(记录锁)。

共享锁和排他锁

        行级锁也分为共享锁和排他锁, 共享锁又称读锁,是读取操作创建的锁。其他用户可以并发读取数据,但任何事务都不能对数据进行修改(获取数据上的排他锁),直到已释放所有共享锁。排他锁又称写锁,如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。

        其中,对于insert、update、delete,InnoDB会自动给涉及的数据加排他锁;对于一般的Select语句,InnoDB不会加任何锁,事务可以通过以下语句给显示加共享锁或排他锁。 

        共享锁: SELECT ... LOCK IN SHARE MODE; 

        排他锁: SELECT ... FOR UPDATE;

死锁

        在采用INNODB的MySQL中,更新操作默认会加行级锁,行级锁是基于索引的,在分析死锁之前需要查询一下mysql的执行计划,看看是否用到了索引,用到了哪个索引,对于没有用索引的操作会采用表级锁。如果操作用到了主键索引会先在主键索引上加锁,然后在其他索引上加锁,否则加锁顺序相反。在并发度高的应用中,批量更新一定要带上记录的主键,优先获取主键上的锁,这样可以减少死锁的发生。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值