标贝科技 https://ai.data-baker.com/#/?source=qwer12
填写邀请码fwwqgs,每日免费调用量还可以翻倍
mysql 锁
锁类型
类型
-
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低
-
- 这些存储引擎通过总是一次性同时获取所有需要的锁以及总是按相同的顺序获取表锁来避免死锁。
- 表级锁更适合于以查询为主,并发用户少,只有少量按索引条件更新数据的应用,如Web 应用
-
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高
-
- 最大程度的支持并发,同时也带来了最大的锁开销
- 在 InnoDB 中,除单个 SQL 组成的事务外,锁是逐步获得的,这就决定了在 InnoDB 中发生死锁是可能的
- 行级锁只在存储引擎层实现,而Mysql服务器层没有实现。 行级锁更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理(OLTP)系统
-
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般
锁粒度和兼容
意向锁
-
实际应用中InnoDB许多行级锁与表级锁共存
-
未来的某个时刻,事务可能要加共享/排它锁了,先提前声明一个意向(在索引树上打一个标记,其他表锁看到意向锁必须等待)
意向锁分类:
-
意向共享锁(intention shared lock, IS),它预示着,事务有意向对表中的某些行加共享S锁
-
意向排它锁(intention exclusive lock, IX),它预示着,事务有意向对表中的某些行加排它X锁
意向锁获取
- 事务要获得某些行的S锁,必须先获得表的IS锁
- 事务要获得某些行的X锁,必须先获得表的IX锁
意向锁的兼容
- InnoDB使用共享锁,可以提高读读并发
- 为了保证数据强一致,InnoDB使用强互斥锁,保证同一行记录修改与删除的串行性
- InnoDB使用插入意向锁,可以提高插入并发
- 由于意向锁仅仅表明意向,它其实是比较弱的锁,意向锁之间并不相互互斥,可以并行
意向共享锁(IS) | 意向排他锁(IX) | 共享锁(S) | 排他锁(X) | |
---|---|---|---|---|
意向共享锁(IS) | 兼容 | 兼容 | 兼容 | 不兼容 |
意向排他锁(IX) | 兼容 | 兼容 | 不兼容 | 不兼容 |
共享锁(S) | 兼容 | 不兼容 | 兼容 | 不兼容 |
排他锁(X) | 不兼容 | 不兼容 | 不兼容 | 不兼容 |
锁冲突兼容
Gap(间隙锁) | Insert Intention(插入意向锁) | Record(行锁) | Next-Key | |
---|---|---|---|---|
Gap(间隙锁) | 兼容 | 兼容 | 兼容 | 兼容 |
Insert Intention(插入意向锁) | 冲突 | 兼容 | 兼容 |