GaussDB 八种常规锁介绍
1 锁产生背景
并发与一致性的矛盾,在多用户的数据库系统中,并发访问和数据一致性是两核需求,但它们天然存在矛盾。
- 无锁数据问题:若多个事务同时修改同一数据,可能导致数据混乱(如银行转账时余额计算错误)
- 串行低效问题:若强制所有事务串行执行,数据库吞吐量将大幅下降。
通过控制对共享资源的访问顺序,在保证数据一致性的前提下,尽可能提高并发度。
2 常规锁作用
用于确保SQL操作的数据一致性,即:ACID特性。
3 八种常规锁产生场景
编号 | 锁模式 | 产生场景 |
1 | AccessShareLock | 当对一个对象进行查询SELECT操作时,会申请该类型的锁,AccessShareLock是最低级别的锁,相当于读写中的共享锁。 |
2 | RowShareLock | 当查询命令指定了FOR update/share时,会申请该类型的锁 |
3 | RowExclusiveLock | 当对数据对象做增删改操作时,会申请该类型的锁,例如对某个表做插入,删除,更新操作时,需要申请该类型的锁。 |
4 | ShareUpdateExclusiveLock | 当执行vacuum(non-full)、analyze、create index concurrently时,需要申请该类型的锁 |
5 | Sharelock | 主要用于创建索引时申请该类型的锁 |
6 | ShareRowExclusiveLock | 和exclusive相似,但和RowShareLock兼容 |
7 | ExclusiveLock | 和AccessExclusivelock类似,但和最低别的读锁AccessSharelock兼容 |
8 | AcsessExclusiveLock | 在对元数据(系统表)做DDL操作时,会申请该类型的锁,AccessExclusiveLock与其他所有的锁模式都不相容。 |
4 解决经典问题
- 写冲突问题
- 事务隔离问题
- 脏读:事务A读取到事务B未提交的数据
- 不可重复读:事务A两次读取的同一数据结果不同
- 幻读:事务A两次查询同一数据范围,结果集行数不同
3. 数据完整性问题
- 外键约束:锁定关联表记录,确保引用完整性
- 唯一约束:锁定唯一索引,防止重复插入。
加意向排他锁(intention Exclusive lock): 锁定索引条目,防止其他事务同时插入相同值
并发场景下保证数据一致性,既要保证一定性能,又要数据安全。