数据库并发

18天前 47.8k 0

数据库并发是多个用户或应用程序同时访问数据库的能力。它允许多个操作(如查询、插入、更新和删除数据)同时在数据库上执行,而不会造成数据冲突或损坏。通过有效的并发控制,数据库可以提高性能和响应时间,从而支持多用户环境下的数据访问和处理。

什么是数据库并发

数据并发性:为了更好地提高事务的处理能力,数据库允许用户通过事务并发地访问与修改同一个数据,我们需要为这种数据并发性来定义语义。

数据一致性:数据库通过维护每次更改,产生新的版本,从而做到读写不互斥, 这被称为多版本并发控制(MVCC)。对于不同的事务版本,我们需要为这种数据多版本来定义语义,保证用户看到一个一致的数据库状态,即数据的一致性快照。

并发控制:以上两种语义称为并发控制模型,也就是 ACID 中的 I (Isolation level)。最简单的并发控制就是串行(serial)执行, 其中串行执行是指一个进程在另一个进程执行完(收到触发操作的回应)一个操作前不会触发下一个操作。但这明显不符合高并发的需求,因此学者们提出了一种可串行化(serializable),即可以通过并行(非串行)地执行事务内的多个操作, 但是最终需要达到和串行执行相同的结果。

有两种常见的实现机制, 即两阶段锁和乐观锁机制。前者是通过排它地通过加锁限制其他的事务的冲突修改,并通过死锁检测机制回滚产生循环的事务保证无环;后者通过在提交时的检测阶段,回滚所有可能会导致异常的事务保证不会产生异常。但是实际上上述两种实现机制提供可串行化隔离级别会极大地影响性能,因此一般会通过允许一些容易接受的成环条件来暴露一些异常,并增加事务的性能和可扩展性。其中快照读和读已提交是比较常见的允许异常的并发控制, 也是 OceanBase 数据库的选择。如何定义隔离级别的抽象,能给予使用者在性能上和语义易用性上的平衡感是设计事务隔离级别(Isolation)的关键之一。

OceanBase 数据库的并发控制模型现在支持快照读和读已提交两种隔离级别,并在分布式语义上隔离级别保证外部一致性。详情参考OceanBase 数据库的并发控制模型。

数据库并发控制模型的锁机制

OceanBase 数据库使用了多版本两阶段锁来维护其并发控制模型的正确性,锁机制是保证正确的数据并发性和一致性很重要的一点。OceanBase 数据库的锁机制使用了以数据行为级别的锁粒度。同一行不同列之间的修改会导致同一把锁上的互斥;而不同行的修改是不同的两把锁,因此是无关的。类似于其余的多版本两阶段锁的数据库,OceanBase 数据库的读取是不上锁的,因此可以做到读写不互斥从而提高用户读写事务的并发能力。对于锁的存储模式,选择将锁存储在行上(可能存储在内存或磁盘上)从而避免在内存中维护大量锁的数据结构。其次,会在内存中维护锁之间的等待关系,从而在锁释放的时候唤醒等待在锁上面的其余事务。

数据库并发相关文章

OceanBase 高并发场景技术解读

https://open.oceanbase.com/blog/7499503392

数据库系统是属于既要又要的系统,既要保证数据库的正确性,又要高并发。在高并发的场景下保证数据库的正确性,关键在于保证事务的 ACID。以 ACID 的 I(Isolation) 为例,I 表示的是在并发事务的场景下,事务并发执行的效果与事务串行执行的效果完全相同,这种隔离级别就是所说的可串行化隔离级别,但是可串行化隔离级别的代价比较大,往往伴随着大量的冲突等待或者冲突失败。

高效利用OceanBase分区表,提升数据库并发

根据业务情况,从表的实际用途和应用场景方面进行设计,选择合适的分区类型建立分区表。分区表在表创建的时候需要指定,后续不支持将非分区表在线改造成分区表,也不支持分区数量、分区类型、分区键值的在线调整(3.x版本)。对于有关联性的表,建议使用关联键作为分区键,并采用相同分区方式,使用 Table Group 将相同的分区配置在同样的节点上,以减少跨节点的数据交互。推荐利⽤覆盖索引来进⾏查询操作,来避免回表操作。对于查询条件过滤性差的SQL,可以SQL绑定执⾏计划。in操作能避免则避免,若实在⽆法避免,需要仔细评估in后边的集合元素数量,控制在100个之内,注意in最⼤个数8192,否则报错size overflow。

OceanBase 并行执行学习笔记 3 —— 并发控制与排队

https://open.oceanbase.com/blog/7085150528

在数据库并发的一定场景下,并行查询会因为等待线程资源而排队,本篇博客就来简单介绍一下并行执行线程资源的管理方式。通过租户级变量 PARALLEL_SERVERS_TARGET 指定租户在每个节点上最多可提供的并行执行工作线程数。在并行查询开始之前,从所有相关 observer 预约工作线程资源,只要其中任何一个 observer 不能为并行查询提供足够资源,就不会投入执行。该并行查询会被丢回查询队列排队,等待下次执行时重新尝试获取线程资源,直到能获取到足够工作线程资源才能获准执行。整个查询执行完成后,立即释放预约的工作线程资源。

数据库并发-1

如何配置集群的 CPU 并发数

本文主要介绍如何通过配置项 workers_per_cpu_quota 与 cpu_quota_concurrency 配置集群中每个 CPU 的并发数。在 OceanBase 数据库中,cpu_quota_concurrency 配置项用于设置集群中每个 CPU 所允许的最大并发数,也可以理解为活跃线程数。对于 OceanBase 数据库 V1.X 版本,该配置项默认为 2;对于 OceanBase 数据库 V2.X 版本,该配置项默认为 4,取值范围为 [1, 10] 。设置该配置项时,您需要结合实际情况进行设置。

方案大促弹性解决方案

OceanBase 作为支撑支付宝核心系统的唯一数据库,连续多年稳定支撑“双11”的极限峰值挑战,积累的先进设计和创新方案,可以在超高并发的大促场景下提供极其稳定、顺滑的服务,并在行业内众多真实场景得到充分验证。https://www.oceanbase.com/solution/ecommerce

相关文章

openGauss数据库源码解析系列文章——SQL引擎源码解析(二)
openGauss资料捉虫活动来袭,你准备好了吗?
HR Schema for openGauss
W1TTY 利用 Oracle 为客户提供更好的数字银行体验
[译文] 在 Oracle Linux 上安装 Oracle Database 21c
windows平台关闭Oracle数据库hang住

发布评论