暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

性能和稳定性的保障——深入解析AntDB-T数据库锁(1)

北陌 2023-12-12
271

前言:

AntDB-T数据库是一款企业级通用分布式关系型数据库,而并发控制是数据库系统中最核心的概念之一,其目的是保证多个并发操作能够正确地读取和修改数据库,AntDB-T数据库实现并发控制的基本方法是使用锁来控制临界区互斥访问。

在多用户并发访问数据库时,如果没有合适的锁机制,可能会导致数据不一致等一系列潜在问题。例如,两个用户同时修改同一行数据可能会导致数据冲突或被损坏。如果使用锁,AntDB-T数据库可以确保一次只有一个用户可以修改数据,从而避免上述情况发生。为了确保复杂的事务可以安全地同时运行,AntDB-T提供了各种级别的锁来控制对各种数据对象的并发访问,使得对数据库关键部分的更改序列化。

在数据库管理系统(DBMS)中,锁是维护数据一致性和完整性的重要工具。AntDB-T数据库同样依赖于锁来确保并发操作的数据一致性和完整性。本文主要阐述AntDB-T数据库的锁的分类、常规锁概念、常规锁的设计以及应用场景。

 

(一)

AntDB-T数据库锁的分类 

本部分主要介绍AntDB-T数据库锁的分类。AntDB-T数据库中定义了三种锁,分别是SpinLock、 LWLock和RegularLock。

SpinLock(自旋锁)

SpinLock是最底层的锁, 它分为与机器相关的实现方法和与机器不相关的实现方法。如果机器支持TAS (test-and-set)指令集,那么AntDB-T数据库就会采用s_lock.h和s_lock.c中定义的SpinLock实现机制;但是如果机器不支持TAS指令集,那么不依赖于硬件的SpinLock的实现定义在spin.h和spin.c中,它需要用到AntDB-T数据库定义的信号量PGSemaphore。

作为一种最底层的锁,一般不直接使用SpinLock,而是利用它来实现其他锁(例如轻量级锁LWLock)。毫无疑问,依赖于硬件的SpinLock机制肯定比不依赖于硬件的SpinLock机制速度快,因为不依赖于硬件的SpinLock机制需要使用PG信号量来仿真SpinLock。

SpinLock的特点是:封锁时间很短、没有等待队列和死锁检测机制、事务结束时不会自动释放SpinLock。

LWLock(轻量级锁)

LWLock (轻量级锁)主要提供对共享存储器的数据结构的互斥访问,它主要是保护这些共享存储器中的数据结构。LWLock有两种锁模式,一种为排他模式,另一种为共享模式。LWLock 不提供死锁检测,但LWLock 管理器在elog恢复期间被自动释放,所以持有LWLock 的期间调用elog发出错误消息不会出现LWLock 未释放的问题。

LWLock 利用SpinLock实现,当没有锁的竞争时可以很快获得或释放LWLock。当一个进程阻塞在一个LWLock上时,相当于它阻塞在一个信号量上,所以不会消耗CPU时间,等待的进程将会以先来后到的顺序被授予锁。

简单来说, LWLock 的特点是:有等待队列、无死锁检测、能自动释放锁。

RegularLock(常规锁)

RegularLock(常规锁)指的是一般数据库事务管理中所指的锁,也简称为Lock。RegularLock(常规锁)它保护的临界区是数据库对象的操作,而不是单纯的共享内存变量或者某一个原子变量。AntDB-T数据库中的数据库对象包括表、页面、元组、事务ID等,RegularLock(常规锁)在这些对象的保护性质中就像是读写锁。

RegularLock(常规锁)由LWLock(轻量级锁)实现,其特点是:有等待队列,有死锁检测,能自动释放锁。后文主要为RegularLock(常规锁)的相关设计。

 

(二)

AntDB-T数据库常规锁 

锁类型

锁方法:AntDB-T数据库包含两种加RegularLock(常规锁)的方法:DEFAULT_LOCKMETHOD和USER_LOCKMETHOD。前者是默认锁方法,后者为用户锁方法。AntDB-T数据库通常使用DEFAULT_LOCKMETHOD作为默认加锁方法。当然,用户也可以定义自己的锁方法,例如建议锁(Advisory Lock)就是用户创建的锁类型之一。

锁粒度:根据锁对象的不同,分为:表级锁、行级锁、页级锁等,具体如下图1所示,每个锁对象的含义如下表所示。


图1:锁对象类型

表1:锁的LOCKTAG类型及说明

锁的LOCKTAG类型

说明

LOCKTAG_RELATION

对表进行加锁

LOCKTAG_RELATION_EXTEND

在对表进行Extend操作时加锁

LOCKTAG_DATABASE_FROZEN_IDS

更新数据库的FROZEN ID时,需要加锁保证只有一个backend做这个操作

LOCKTAG_PAGE

对页面进行加锁

LOCKTAG_TUPLE

对元组进行加锁

LOCKTAG_TRANSACTION

在分配事务ID时对这个事务ID进行加锁,用于元组并发更新时做事务等待

LOCKTAG_VIRTUALTRANSACTION

在没有分配事务ID的事务中,对虚拟事务ID加锁

LOCKTAG_SPECULATIVE_TOKEN

 

LOCKTAG_OBJECT

对非表对象类型进行加锁

LOCKTAG_USERLOCK

用户级别的锁,自定义

LOCKTAG_ADVISORY

咨询锁,区别于其他锁类型

从上表可以看出,常规锁不仅可以对表加锁,也可以对各类对象加锁,我们平时说的表锁(表级锁)、页锁、咨询锁等等(行锁除外),实际上都是常规锁根据不同锁定对象划分的子类。但是这里说的行锁除外, 因为AntDB-T数据库采用元组级常规锁+xmax结合的方式来实现行锁,并不是单纯用元组级常规锁来实现的。

常规锁最常用于给表加锁,表级锁:两个事务在同一时刻不能在同一个表上持有互相冲突的锁,但是可以同时持有不冲突的锁。

表2:常规锁模式说明(按排他级别从低到高排序)

序号

锁模式

说明

1

AccessShareLock

SELECT命令在被引用的表上获得一个这种模式的锁。通常,任何只读取表而不修改它的查询都将获得这种锁模式

2

RowShareLock

SELECT FOR UPDATE和SELECT FOR SHARE命令在目标表上取得一个这种模式的锁 (加上在被引用但没有选择FOR UPDATE/FOR SHARE的任何其他表上的ACCESS SHARE锁)

3

RowExclusiveLock

命令UPDATE、DELETE和INSERT在目标表上取得这种锁模式(加上在任何其他被引用表上的ACCESS SHARE锁)。通常,这种锁模式将被任何修改表中数据的命令取得。

4

ShareUpdateExclusiveLock

由VACUUM(不带FULL)、ANALYZE、 CREATE INDEX CONCURRENTLY、REINDEX CONCURRENTLY、 CREATE STATISTICS以及某些ALTER INDEX和 ALTER TABLE的变体获得。这种模式保护一个表不受并发模式改变和VACUUM运行的影响。

5

ShareLock

由CREATE INDEX(不带CONCURRENTLY)取得。这种模式保护一个表不受并发数据改变的影响。

6

ShareRowExclusiveLock

由CREATE TRIGGER和某些形式的 ALTER TABLE所获得。这种模式保护一个表不受并发数据修改所影响,并且是自排他的,这样在一个时刻只能有一个会话持有它。

7

ExclusiveLock

由REFRESH MATERIALIZED VIEW CONCURRENTLY获得。这种模式只允许并发的ACCESS SHARE锁,即只有来自于表的读操作可以与一个持有该锁模式的事务并行处理。

8

AccessExclusiveLock

ALTER TABLE、DROP TABLE、TRUNCATE、REINDEX、CLUSTER、VACUUM FULL 和 REFRESH MATERIALIZED VIEW(不带CONCURRENTLY)命令会获得。很多形式的 ALTER INDEX 和 ALTER TABLE 也在这个层面上获得锁。这也是未显式指定模式的 LOCK TABLE 命令的默认锁模式。

这种模式与所有模式的锁冲突。这种模式保持者是访问该表的唯一事务。

 

表3:常规锁冲突的锁模式(按排他级别从低到高排序)

请求的锁模式

已存在的锁模式

ACCESS SHARE

ROW SHARE

ROW EXCL.

SHARE UPDATE EXCL.

SHARE

SHARE ROW EXCL.

EXCL.

ACCESS EXCL.

ACCESS SHARE

 

 

 

 

 

 

 

X

ROW SHARE

 

 

 

 

 

 

X

X

ROW EXCL.

 

 

 

 

X

X

X

X

SHARE UPDATE EXCL.

 

 

 

X

X

X

X

X

SHARE

 

 

X

X

 

X

X

X

SHARE ROW EXCL.

 

 

X

X

X

X

X

X

EXCL.

 

X

X

X

X

X

X

X

ACCESS EXCL.

X

X

X

X

X

X

X

X


关于亚信安慧AntDB数据库

亚信安慧AntDB数据库始于2008年,在运营商的核心系统上,为全国24个省份的10亿多用户提供在线服务,具备高性能、弹性扩展、高可靠等产品特性,峰值每秒可处理百万笔电信核心交易,保障系统持续稳定运行近十年,并在通信、金融、交通、能源、物联网等行业成功商用落地。

 

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论