秒杀减库存加速,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,尽在数据技术嘉年华!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/enmotech/article/details/129134374
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/570582

相关文章

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的

Navicat数据表的数据添加,删除及使用sql完成数据的添加过程

《Navicat数据表的数据添加,删除及使用sql完成数据的添加过程》:本文主要介绍Navicat数据表的数据添加,删除及使用sql完成数据的添加过程,具有很好的参考价值,希望对大家有所帮助,如有... 目录Navicat数据表数据添加,删除及使用sql完成数据添加选中操作的表则出现如下界面,查看左下角从左

SpringBoot中4种数据水平分片策略

《SpringBoot中4种数据水平分片策略》数据水平分片作为一种水平扩展策略,通过将数据分散到多个物理节点上,有效解决了存储容量和性能瓶颈问题,下面小编就来和大家分享4种数据分片策略吧... 目录一、前言二、哈希分片2.1 原理2.2 SpringBoot实现2.3 优缺点分析2.4 适用场景三、范围分片

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模