秒杀减库存加速,Oracle 23c也学会了?从PolarDB到MogDB,尽在数据技术嘉年华!

本文主要是介绍秒杀减库存加速,Oracle 23c也学会了?从PolarDB到MogDB,尽在数据技术嘉年华!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在很多高并发场景中,并发事务控制 一直是对于数据库的一个重要挑战。典型的应用,如电商中的秒杀、阿里的双十一等。

以下是一个 Oracle 数据库的Demo用例,在同一条记录的同时更新中,我们观察到了什么?e23ff5352ea9c66eae19d40220bb0f04.gif

是的,没有阻塞,结果最终一致。这源自 Oracle Database 23c 的一个新特性:托管列并发控制(Escrow Column Concurrency Control)

Escrow 的词义是托管、代管。也就是说,在这个特性下,数据的一致性由系统代管,脱离经典的并发控制原则。在以上 update 执行过程中,提交前执行查询,读一致性是不支持的:

94430f21aa635f787a4f56d6340b06cb.png

官方的解释是:这个特性就是为了解决在电商等高并发环境下,加减库存的高频需求

而这一场景,是最早阿里巴巴双11面临的关键挑战,如果处理不好,就可能发生阻塞、雪崩、超卖等问题,所以在这一特性方向上,阿里数据库是先驱者。那么在 PolarDB 中是如何实现的呢?

PolarDB-X 通过“水车模型”,在识别出热点SQL后,实现了在内核层面优化处理,相比官方MySQL提高了10倍以上的热点行扣减能力。

利用多个数据桶构建一个逻辑上轮转的模型(类似于中国古代的水车),并且通过控制每个数据桶的状态来协调数据处理,从而将瞬时压力归并分解均摊,并可以借助多节点的并行写入提高吞吐。

主要核心思想是:针对应用层SQL做轻量化改造,带上"热点行SQL"的标签,当这种SQL进入内核后,在内存中维护一个hash表,将主键或唯一键相同的请求hash到一处做请求合并,一段时间后(默认100us)统一提交,从而实现了串行处理批量化。

在锁处理中,按照时间顺序将对同一数据行的更新操作进行分组,组内第一个更新操作为Leader,其读取目标数据行并且加锁,后续更新操作为Follower,对目标数据行加锁时,如果发现Leader已经持有行锁,不需要等待,直接获得行锁。通过这个优化,能够减少行锁的加锁次数和时间开销,整个数据库系统的性能有了显著的提升。

2b82abccda8ff5737f72546b680af2bb.png

在 MogDB 中,为了增强事务效率,同样作出了新特性增强,这其中一个就是:自治的异步事务提交特性。

在常规的数据库事务处理中,使用的是同步提交模式,在发出提交指令后,工作线程等待成功反馈;为了提高效率,可以启用异步提交,但是异步提交可能存在一定的风险。

MogDB 通过自治的启用一组轻量级IO线程,接管异步提交任务的IO工作,确保异步提交的安全性。从而可以使异步提交成为主工作模式,提高事务处理效率。

287f78ebc9c8665d6bf23ceec2225f9b.png

在不同场景和事务特征下,不同的实现方案各有用武之地。针对 ESCROW 特性,严格限定在对数值的自身加减操作,从这个设计可以分解出很多有意思的约束。

在 Oracle 21c 的官方文档上,已经披露了关于这一特性的详细信息。通过错误防护,可以看到这个特性的严格限制,包括表必须有主键,查询条件要包含主键全部字段,只能基于自身增减,不能同时更新non-escrow字段等:

  1. 只支持有限的数据类型 Number、Integer、Float

ORA-55748: Escrow column is supported only on columns of types Oracle NUMBER, INTEGER, and FLOAT.

  1. Escrow 列只支持单表达式的、自身加减操作。

ORA-55734: Escrow column SET clause requires a single expression value to be added or subtracted from the given escrow column. Use parenthesis as appropriate. The SET clause should be of the form e = e + (expression) or e = e - (expression), where e is the escrow column name.

  1. 只支持用户表,不支持SYSTEM表

ORA-55755: Escrow column is only supported on user tables.
ORA-55756: Escrow column is not supported on system tables.

  1. 命名 SYS_ESCROWJRNL_对象用于内部日志处理

ORA-55777: A reserved name cannot be used for naming a user table.  Cause: An attempt was made to create a user table with a name starting with 'SYS_ESCROWJRNL_'

  1. 不支持分布式事务,更新语句需要包含所有主键定义列

ORA-55732: Escrow update should specify all the primary key columns
ORA-55731: Escrow update is not supported in a distributed transaction

        5. Escrow 和 non-escrow 不能同时更新

ORA-55735: Escrow and non-escrow columns cannot be updated in same statement.

这一特性是为简化开发者应用而设计的,在技术上,通过 Escrow locking 的方式实现:

289ac4e7587cfbeb118ae1f1e6f66d81.png

无论是 PolarDB-X 在秒杀场景的原理、Oracle 23c 的新特性解读,还是 MogDB 的新特性设计实现... 精彩主题,尽在 2023 数据技术嘉年华 大会!

主题
演讲嘉宾
嘉宾介绍
一站式、全场景数据管理与服务

李飞飞

阿里巴巴集团副总裁,阿里云数据库产品事业部负责人,ACM和IEEE会士(Fellow)
将云原生进行到底:PolarDB 的实践和创新

杨辛军

阿里巴巴集团研究员,阿里云数据库事业部PolarDB-MySQL产品部负责人

Oracle Database 23c 创新特性和SQL增强

杨廷琨

云和恩墨联合创始人兼CTO

MogDB中自治异步事务提交的设计与实现

王春玲

云和恩墨·本原数据内核研发工程师

数据技术嘉年华,中国数据库力量的集中展示,欢迎加入我的亲友团(邀请码一周内有效),北京欢迎你


云和恩墨大讲堂 | 一个分享交流的地方

长按,识别二维码,加入万人交流社群

请备注:云和恩墨大讲堂

  点个“在看” 

你的喜欢会被看到❤

这篇关于秒杀减库存加速,Oracle 23c也学会了?从PolarDB到MogDB,尽在数据技术嘉年华!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/570582

相关文章

sqlserver、mysql、oracle、pgsql、sqlite五大关系数据库的对象名称和转义字符

《sqlserver、mysql、oracle、pgsql、sqlite五大关系数据库的对象名称和转义字符》:本文主要介绍sqlserver、mysql、oracle、pgsql、sqlite五大... 目录一、转义符1.1 oracle1.2 sqlserver1.3 PostgreSQL1.4 SQLi

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

Java中的Schema校验技术与实践示例详解

《Java中的Schema校验技术与实践示例详解》本主题详细介绍了在Java环境下进行XMLSchema和JSONSchema校验的方法,包括使用JAXP、JAXB以及专门的JSON校验库等技术,本文... 目录1. XML和jsON的Schema校验概念1.1 XML和JSON校验的必要性1.2 Sche

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程

Pandas处理缺失数据的方式汇总

《Pandas处理缺失数据的方式汇总》许多教程中的数据与现实世界中的数据有很大不同,现实世界中的数据很少是干净且同质的,本文我们将讨论处理缺失数据的一些常规注意事项,了解Pandas如何表示缺失数据,... 目录缺失数据约定的权衡Pandas 中的缺失数据None 作为哨兵值NaN:缺失的数值数据Panda

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

Oracle数据库在windows系统上重启步骤

《Oracle数据库在windows系统上重启步骤》有时候在服务中重启了oracle之后,数据库并不能正常访问,下面:本文主要介绍Oracle数据库在windows系统上重启的相关资料,文中通过代... oracle数据库在Windows上重启的方法我这里是使用oracle自带的sqlplus工具实现的方

Oracle Scheduler任务故障诊断方法实战指南

《OracleScheduler任务故障诊断方法实战指南》Oracle数据库作为企业级应用中最常用的关系型数据库管理系统之一,偶尔会遇到各种故障和问题,:本文主要介绍OracleSchedul... 目录前言一、故障场景:当定时任务突然“消失”二、基础环境诊断:搭建“全局视角”1. 数据库实例与PDB状态2

python库pydantic数据验证和设置管理库的用途

《python库pydantic数据验证和设置管理库的用途》pydantic是一个用于数据验证和设置管理的Python库,它主要利用Python类型注解来定义数据模型的结构和验证规则,本文给大家介绍p... 目录主要特点和用途:Field数值验证参数总结pydantic 是一个让你能够 confidentl

JAVA实现亿级千万级数据顺序导出的示例代码

《JAVA实现亿级千万级数据顺序导出的示例代码》本文主要介绍了JAVA实现亿级千万级数据顺序导出的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 前提:主要考虑控制内存占用空间,避免出现同时导出,导致主程序OOM问题。实现思路:A.启用线程池