点击上方蓝字关注我们

点击上方蓝字关注我们




共享锁,英文名:Shared Locks,简称S锁。在事务要读取一条记录时,需要先获取该记录的S锁。 独占锁,也常称排他锁,英文名:Exclusive Locks,简称X锁。在事务要改动一条记录时,需要先获取该记录的X 锁。
如果事务T2想要再获取一个记录的S锁,那么事务T2也会获得该锁,也就意味着事务T1和T2在该记录上同时持有S 锁。 如果事务T2想要再获取一个记录的X锁,那么此操作会被阻塞,直到事务T1提交之后将S锁释放掉。

对读取的记录加S锁:
SELECT ... LOCK IN SHARE MODE;
对读取的记录加X锁:
SELECT ... FOR UPDATE;
DELETE:对一条记录做DELETE操作的过程其实是先在B+树中定位到这条记录的位置,然后获取一下这条记录的X 锁,然后再执行delete mark操作。我们也可以把这个定位待删除记录在B+树中位置的过程看成是一个获取X锁的锁定读。 INSERT:一般情况下,新插入一条记录的操作并不加锁,InnoDB通过一种称之为隐式锁来保护这条新插入的记录在本事务提交前不被别的事务访问。当然,在一些特殊情况下INSERT操作也是会获取锁的,具体情况我们后边再说。 UPDATE:在对一条记录做UPDATE操作时分为三种情况: 如果未修改该记录的主键值并且被更新的列占用的存储空间在修改前后未发生变化,则先在B+树中定位到这条记录的位置,然后再获取一下记录的X锁,最后在原记录的位置进行修改操作。其实我们也可以把这个定位待修改记录在B+树中位置的过程看成是一个获取X锁的锁定读。 如果未修改该记录的主键值并且至少有一个被更新的列占用的存储空间在修改前后发生变化,则先在B+树中定位到这条记录的位置,然后获取一下记录的X锁,将该记录彻底删除掉(就是把记录彻底移入垃圾链表),最后再插入一条新记录。这个定位待修改记录在B+树中位置的过程看成是一个获取X锁的锁定读,新插入的记录由INSERT操作提供的隐式锁进行保护。 如果修改了该记录的键值,则相当于在原记录上做DELETE操作之后再来一次INSERT操作,加锁操作就需要按照DELETE和INSERT的规则进行了。

锁定粒度:表锁> 行锁 加锁效率:表锁> 行锁 冲突概率:表锁> 行锁 并发性能:表锁< 行锁 加锁位置:表锁由MySQL服务层提供,行锁由InnoDB存储引擎层提供
别的事务可以继续获得该表的S锁 别的事务可以继续获得该表中的某些记录的S锁 别的事务不可以继续获得该表的X锁 别的事务不可以继续获得该表中的某些记录的X锁
别的事务不可以继续获得该表的S锁 别的事务不可以继续获得该表中的某些记录的S锁 别的事务不可以继续获得该表的X锁 别的事务不可以继续获得该表中的某些记录的X锁。

若想给表加S锁,得先确保表中记录没有X锁 若想给表加X锁,得先确保表中记录没有X锁和S锁
意向共享锁(Intention Shared Lock):简称IS锁,当事务准备在某记录上加S锁时,需要先在表级别加上一个IS锁 意向独占锁(Intention Exclusive Lock):简称IX锁,当事务准备在某记录上加X锁时,需要先在表级别加上一个IX锁
当想给记录加S锁时,先给表加一个IS锁,然后再给记录加S锁 当想给记录加X锁时,先给表加IX锁,然后再给记录加X锁
如果想给表加S锁,先看下表加没加IX锁,如果有的话,则表明此表中的记录有X锁,则需要等到IX锁释放掉后才可以加S锁 如果想给表加X锁,先看下表加没加IS锁或者IX锁,如果有的话,则表明此表中的记录有S锁或者X锁,则需要等到IS锁或者IX锁释放掉后才可以加X锁


文章转载自KunlunBase 昆仑数据库,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。





