秒杀减库存加速,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

相关文章

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

MySQL大表数据的分区与分库分表的实现

《MySQL大表数据的分区与分库分表的实现》数据库的分区和分库分表是两种常用的技术方案,本文主要介绍了MySQL大表数据的分区与分库分表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. mysql大表数据的分区1.1 什么是分区?1.2 分区的类型1.3 分区的优点1.4 分

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

Redis 中的热点键和数据倾斜示例详解

《Redis中的热点键和数据倾斜示例详解》热点键是指在Redis中被频繁访问的特定键,这些键由于其高访问频率,可能导致Redis服务器的性能问题,尤其是在高并发场景下,本文给大家介绍Redis中的热... 目录Redis 中的热点键和数据倾斜热点键(Hot Key)定义特点应对策略示例数据倾斜(Data S

Python实现将MySQL中所有表的数据都导出为CSV文件并压缩

《Python实现将MySQL中所有表的数据都导出为CSV文件并压缩》这篇文章主要为大家详细介绍了如何使用Python将MySQL数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到... python将mysql数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到另一个