数据库共有七种锁,详细的只介绍几个常用的。
一、共享锁(S锁)和排他锁(X锁)
事务拿到一行数据的共享S锁,才可以读取这一行,并阻止别的事务对其添加X锁
事务拿到一行数据的排他X锁、才可以修改或者删除这一行
共享锁的目的是提高读并发
排他锁的目的是为了保证数据的一致性
二、意向锁
1、意向共享锁
预示事务有意向对表中的某些行锁加共享S锁
2、意向排他锁
预示事务有意向表中的某些行锁加排他X锁
3、IS、S、IX、X锁之间的兼容性比较:
4、意向锁的意义在哪里?
a、IX、IS是表级锁、不会和行级的X、S锁发生冲突。只会好表级的X、S发生冲突
b、意向锁是在添加行锁之前添加
c、如果发生没有意向锁,当向一个表添加表级X锁时,就需要遍历整张表来判断是否存在行锁,以免发生冲突
d、如果有了意向锁,只需要判断该意向锁与表级锁是否兼容即可。
三、插入意向锁
插入意向锁是间隙锁的一种,针对insert操作产生,目的是提供插入并发
多个事务,在同一个索引,同一个范围区间进行插入数据的时候,如果插入的位置不冲突,不会阻塞彼此
由于事物一和事物二都是对表的同一索引范围进行insert,使用的插入意向锁,由于插入的记录并不冲突,所以并不会阻塞事物二。如果事物二插入的记录与事物一冲突,会被X锁阻塞。
四、记录锁
对单条索引数据进行加锁,锁住的是索引数据而非数据本身,即使表中没有任何索引,MySQL会自动创建一个隐式的row_id作为聚集索引来进行加锁
五、间隙锁(gap锁)
封锁记录中的间隔,防止间隔中被其他事务插入
间隙锁主要出现在RR隔离级别,避免出现幻读
六、临键锁(Next-Key Locks)
临建锁是记录锁和间隙锁的组合,即锁住了记录也锁住了范围
临建锁的主要目的,也是避免幻读
如果把事务的隔离级别降到RC,临键锁也会失效
七、自增长锁
自增长锁是一种表级锁,专门针对auto_increment类型的列