|
`LOCK_MODE` 是描述 InnoDB 锁具体行为模式的关键属性,它与 `LOCK_TYPE` 共同定义了锁的完整特性。以下是 InnoDB 中各种锁模式的全面解析:
## 基础锁模式
### 1. `S` (Shared Lock/共享锁)
- **特性**:
- 允许多个事务同时读取
- 阻止其他事务获取排他锁(X)
- **SQL示例**:
```sql
SELECT * FROM table LOCK IN SHARE MODE;
```
### 2. `X` (Exclusive Lock/排他锁)
- **特性**:
- 允许持有事务读写数据
- 阻止其他事务获取任何锁(S/X)
- **SQL示例**:
```sql
SELECT * FROM table FOR UPDATE;
UPDATE table SET col = value WHERE id = 1;
```
## 意向锁模式
### 3. `IS` (Intent Shared Lock/意向共享锁)
- **作用**:表示事务打算在表的某些行上设置S锁
- **兼容性**:与其他IS锁兼容,与IX锁部分兼容
### 4. `IX` (Intent Exclusive Lock/意向排他锁)
- **作用**:表示事务打算在表的某些行上设置X锁
- **兼容性**:仅与其他IX锁兼容
## 特殊锁模式
### 5. `GAP` (间隙锁)
- **标识**:通常与其他模式组合出现
- **示例**:
- `S,GAP`:共享间隙锁
- `X,GAP`:排他间隙锁
### 6. `NEXT-KEY` (临键锁)
- **实际表现**:显示为`X`或`S`,但实际是记录锁+间隙锁组合
- **默认行为**:REPEATABLE READ隔离级的默认锁模式
### 7. `INSERT_INTENTION` (插入意向锁)
- **特殊标记**:专为INSERT操作设计
- **目的**:提高并发插入性能
## 组合锁模式
| 锁模式表示 | 实际含义 |
|------------------|----------------------------------|
| `X` | 排他记录锁 |
| `X,REC_NOT_GAP` | 仅对记录本身加锁(不含间隙) |
| `X,GAP` | 排他间隙锁 |
| `X,INSERT_INTENTION` | 插入意向排他锁 |
| `S` | 共享记录锁 |
| `S,REC_NOT_GAP` | 仅对记录本身的共享锁 |
## 锁模式查看方法
```sql
-- 查看详细锁信息
SELECT
lock_mode,
lock_type,
object_name,
lock_status
FROM performance_schema.data_locks;
```
## 生产环境关键点
1. **锁升级警告**:
- 无索引查询会导致行锁升级为表锁
```sql
-- 无索引列查询将锁定全表
UPDATE table SET col = 1 WHERE unindexed_column = 5;
```
2. **死锁分析**:
```sql
SHOW ENGINE INNODB STATUS\G
-- 关注TRANSACTIONS和LOCK WAIT部分
```
3. **性能优化**:
- 监控锁等待时间
```sql
SELECT * FROM sys.innodb_lock_waits;
```
- 确保所有查询都使用合适索引
理解这些锁模式对于诊断数据库并发冲突、优化事务性能至关重要,特别是在高并发OLTP系统中。
|
|