什么是数据库锁

数据库锁是一种用于控制并发访问、保证数据一致性的机制。通过对共享资源(如表、行)加锁,防止多个事务同时对其进行修改,从而避免数据不一致性。

核的心作用

保证数据一致性、实现事务隔离性、提高并发性能;

按锁的粒度分类

锁的类型

粒度

开销

加锁速度

并发度

主要存储引擎

表级锁 (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默认行锁模式

幻读 + 丢失更新

死锁的概念

死锁通常发生在以下情况下:

  • 事务A持有锁资源1,并请求锁资源2。

  • 事务B持有锁资源2,并请求锁资源1。

  • 由于相互持有的锁资源,两个事务都无法继续执行,从而产生死锁。

如何解决死锁

预防:固定访问顺序

发生时如何解决:自身机制检测死锁循环,发现时立刻介入,强制回滚其中一个事务

悲观锁和乐观锁

  • 解决并发问题时两种截然不同的“心态”

    • 悲观锁:我觉得一定会有人跟我抢,所以先锁上门,再干活

    • 乐观锁:我觉得大概率没人跟我抢,所以先干活,提交时再检查

指令语法

 # 全局锁
 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;

同时给多张表加不同级别的锁,当前会话只能访问被锁定的这些表