什么是数据库锁
数据库锁是一种用于控制并发访问、保证数据一致性的机制。通过对共享资源(如表、行)加锁,防止多个事务同时对其进行修改,从而避免数据不一致性。
核的心作用
保证数据一致性、实现事务隔离性、提高并发性能;
按锁的粒度分类
锁的类型 | 粒度 | 开销 | 加锁速度 | 并发度 | 主要存储引擎 |
|---|
表级锁 (Table) | 大 | 小 | 快 | 低 | MyISAM, InnoDB |
行级锁 (Row) | 小 | 大 | 慢 | 高 | InnoDB |
页级锁 (Page) | 中等 | 中等 | 中等 | 中等 | BDB |
核心规律:粒度越小 → 并发越高 → 开销越大 → 加锁越慢 → 死锁风险越高
表、行详解
一、表级锁
项目 | 内容 |
|---|
锁定对象 | 整张表 |
核心特点 | 机制简单粗暴,开销小、加锁快,无死锁风险 |
并发能力 | 低(锁冲突严重) |
锁类型 | 共享锁(S,读锁)、排他锁(X,写锁) |
兼容规则 | S/S 兼容;S/X 互斥;X/X 互斥(即:读读兼容,读写互斥,写写互斥) |
适用场景 | 读多写少(如报表查询)、批量操作、数据备份 |
代表引擎 | MyISAM(默认);InnoDB(DDL或未命中索引时) |
二、行级锁
项目 | 内容 |
|---|
锁定对象 | 单行记录 |
核心特点 | 粒度最细,并发度高,但开销大、加锁慢,有死锁风险 |
并发能力 | 高(多事务可并发修改不同行) |
锁类型 | 共享锁(S)、排他锁(X)、意向共享锁(IS)、意向排他锁(IX) |
兼容规则 | 除S/S、IS/IS、IS/IX、IX/IX兼容外,其他组合均互斥(需依赖意向锁协同) |
实现原理 | 基于索引实现——命中索引=行锁,未命中=退化为表锁 |
适用场景 | 高并发OLTP系统(电商秒杀、金融交易) |
代表引擎 | InnoDB(默认);Oracle |
三种行锁总览
锁类型 | 英文 | 锁定对象 | 核心作用 | 防止问题 |
|---|
记录锁 | Record Lock | 索引中的具体一条记录 | 防止其他事务修改该记录 | 丢失更新 |
间隙锁 | Gap Lock | 索引记录之间的间隙(不包含记录本身) | 防止其他事务在间隙中插入新记录 | 幻读 |
临键锁 | Next-Key Lock | 记录锁 + 间隙锁(记录及其前面的间隙) | 结合两者功能,是InnoDB默认行锁模式 | 幻读 + 丢失更新 |
死锁的概念
死锁通常发生在以下情况下:
如何解决死锁
预防:固定访问顺序
发生时如何解决:自身机制检测死锁循环,发现时立刻介入,强制回滚其中一个事务
悲观锁和乐观锁
指令语法
# 全局锁
flush tables with read lock;
# 表级锁(表共享锁)
lock tables 表名 read;
# 表级锁(表独占写锁)
lock tables 表名 write;
# 解锁(全局锁/表级锁)
unlock tables;
锁类型 | 加锁命令 | 释放命令 | 说明 |
|---|
全局读锁 | FLUSH TABLES WITH READ LOCK;
| UNLOCK TABLES;
| 锁住整个实例的所有表,仅可读 |
表级读锁(共享锁) | LOCK TABLES 表名 READ;
| UNLOCK TABLES;
| 锁住指定表,当前会话和其他会话均可读,但均不可写 |
表级写锁(独占锁) | LOCK TABLES 表名 WRITE;
| UNLOCK TABLES;
| 锁住指定表,当前会话可读可写,其他会话不可读不可写 |
混合表锁 | LOCK TABLES 表1 READ, 表2 WRITE;
| UNLOCK TABLES;
| 同时给多张表加不同级别的锁,当前会话只能访问被锁定的这些表 |
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法