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

相关文章

javaScript在表单提交时获取表单数据的示例代码

《javaScript在表单提交时获取表单数据的示例代码》本文介绍了五种在JavaScript中获取表单数据的方法:使用FormData对象、手动提取表单数据、使用querySelector获取单个字... 方法 1:使用 FormData 对象FormData 是一个方便的内置对象,用于获取表单中的键值

Rust中的BoxT之堆上的数据与递归类型详解

《Rust中的BoxT之堆上的数据与递归类型详解》本文介绍了Rust中的BoxT类型,包括其在堆与栈之间的内存分配,性能优势,以及如何利用BoxT来实现递归类型和处理大小未知类型,通过BoxT,Rus... 目录1. Box<T> 的基础知识1.1 堆与栈的分工1.2 性能优势2.1 递归类型的问题2.2

Python使用Pandas对比两列数据取最大值的五种方法

《Python使用Pandas对比两列数据取最大值的五种方法》本文主要介绍使用Pandas对比两列数据取最大值的五种方法,包括使用max方法、apply方法结合lambda函数、函数、clip方法、w... 目录引言一、使用max方法二、使用apply方法结合lambda函数三、使用np.maximum函数

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行

PLsql Oracle 下载安装图文过程详解

《PLsqlOracle下载安装图文过程详解》PL/SQLDeveloper是一款用于开发Oracle数据库的集成开发环境,可以通过官网下载安装配置,并通过配置tnsnames.ora文件及环境变... 目录一、PL/SQL Developer 简介二、PL/SQL Developer 安装及配置详解1.下

Redis的数据过期策略和数据淘汰策略

《Redis的数据过期策略和数据淘汰策略》本文主要介绍了Redis的数据过期策略和数据淘汰策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录一、数据过期策略1、惰性删除2、定期删除二、数据淘汰策略1、数据淘汰策略概念2、8种数据淘汰策略

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

Python给Excel写入数据的四种方法小结

《Python给Excel写入数据的四种方法小结》本文主要介绍了Python给Excel写入数据的四种方法小结,包含openpyxl库、xlsxwriter库、pandas库和win32com库,具有... 目录1. 使用 openpyxl 库2. 使用 xlsxwriter 库3. 使用 pandas 库

SpringBoot定制JSON响应数据的实现

《SpringBoot定制JSON响应数据的实现》本文主要介绍了SpringBoot定制JSON响应数据的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录前言一、如何使用@jsonView这个注解?二、应用场景三、实战案例注解方式编程方式总结 前言