一、按锁的粒度划分
- 全局锁
- 界说:锁定整个数据库实例,克制所有写操作,确保数据备份同等性。
- 加锁方式:通过FLUSH TABLES WITH READ LOCK实现,释放需实验UNLOCK TABLES。
- 应用场景:适用于全库逻辑备份,但会壅闭所有数据变更。
- 表级锁
- 表锁:分为读锁(共享锁)和写锁(排他锁),由LOCK TABLES ... READ/WRITE显式控制。
- 元数据锁(MDL) :自动在访问表时添加,防止表布局变更与读写冲突,事件提交后释放。
- 意向锁:InnoDB特有,分为意向共享锁(IS)和意向排他锁(IX),用于快速判断表中是否有行级锁。
- 特点:开销小、加锁快,但并发度低,易引发锁冲突。
- 存储引擎支持:MyISAM仅支持表锁;InnoDB支持表锁与行锁。
- 行级锁
- 实现机制:由InnoDB引擎支持,基于索引实现。若SQL未使用索引,行锁会退化为表锁。
- 具体类型:
- 记录锁(Record Lock) :锁定单行记录。
- 间隙锁(Gap Lock) :锁定索引记录间的间隙,防止其他事件插入数据。
- 临键锁(Next-Key Lock) :记录锁+间隙锁的组合,锁定左开右闭的区间,解决幻读问题。
二、按锁的属性划分
- 共享锁(S锁)
- 界说:允许其他事件读取但禁止写入。
- 加锁方式:通过SELECT ... LOCK IN SHARE MODE或SELECT ... FOR SHARE实现。
- 应用场景:适用于多事件并发读取同一数据。
- 排他锁(X锁)
- 界说:禁止其他事件读写锁定对象。
- 加锁方式:通过SELECT ... FOR UPDATE或更新语句(如UPDATE)自动添加。
- 应用场景:数据修改或需要独占访问的场景。
三、按加锁机制划分
- 悲观锁
- 原理:假定并发冲突一定发生,操作前先获取锁(如共享锁或排他锁)。
- 实现方式:通过数据库内置锁机制(如FOR UPDATE)实现。
- 乐观锁
- 原理:假定冲突较少,通过版本号或时间戳校验数据是否被修改。
- 实现方式:使用WHERE条件检查数据版本,若冲突则重试或回滚。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |