本文主要是介绍秒杀减库存加速,Oracle 23c也学会了?从PolarDB到MogDB,尽在数据技术嘉年华!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在很多高并发场景中,并发事务控制 一直是对于数据库的一个重要挑战。典型的应用,如电商中的秒杀、阿里的双十一等。
以下是一个 Oracle 数据库的Demo用例,在同一条记录的同时更新中,我们观察到了什么?
是的,没有阻塞,结果最终一致。这源自 Oracle Database 23c 的一个新特性:托管列并发控制(Escrow Column Concurrency Control)。
Escrow 的词义是托管、代管。也就是说,在这个特性下,数据的一致性由系统代管,脱离经典的并发控制原则。在以上 update 执行过程中,提交前执行查询,读一致性是不支持的:
官方的解释是:这个特性就是为了解决在电商等高并发环境下,加减库存的高频需求。
而这一场景,是最早阿里巴巴双11面临的关键挑战,如果处理不好,就可能发生阻塞、雪崩、超卖等问题,所以在这一特性方向上,阿里数据库是先驱者。那么在 PolarDB 中是如何实现的呢?
PolarDB-X 通过“水车模型”,在识别出热点SQL后,实现了在内核层面优化处理,相比官方MySQL提高了10倍以上的热点行扣减能力。
利用多个数据桶构建一个逻辑上轮转的模型(类似于中国古代的水车),并且通过控制每个数据桶的状态来协调数据处理,从而将瞬时压力归并分解均摊,并可以借助多节点的并行写入提高吞吐。
主要核心思想是:针对应用层SQL做轻量化改造,带上"热点行SQL"的标签,当这种SQL进入内核后,在内存中维护一个hash表,将主键或唯一键相同的请求hash到一处做请求合并,一段时间后(默认100us)统一提交,从而实现了串行处理批量化。
在锁处理中,按照时间顺序将对同一数据行的更新操作进行分组,组内第一个更新操作为Leader,其读取目标数据行并且加锁,后续更新操作为Follower,对目标数据行加锁时,如果发现Leader已经持有行锁,不需要等待,直接获得行锁。通过这个优化,能够减少行锁的加锁次数和时间开销,整个数据库系统的性能有了显著的提升。
在 MogDB 中,为了增强事务效率,同样作出了新特性增强,这其中一个就是:自治的异步事务提交特性。
在常规的数据库事务处理中,使用的是同步提交模式,在发出提交指令后,工作线程等待成功反馈;为了提高效率,可以启用异步提交,但是异步提交可能存在一定的风险。
MogDB 通过自治的启用一组轻量级IO线程,接管异步提交任务的IO工作,确保异步提交的安全性。从而可以使异步提交成为主工作模式,提高事务处理效率。
在不同场景和事务特征下,不同的实现方案各有用武之地。针对 ESCROW 特性,严格限定在对数值的自身加减操作,从这个设计可以分解出很多有意思的约束。
在 Oracle 21c 的官方文档上,已经披露了关于这一特性的详细信息。通过错误防护,可以看到这个特性的严格限制,包括表必须有主键,查询条件要包含主键全部字段,只能基于自身增减,不能同时更新non-escrow字段等:
只支持有限的数据类型 Number、Integer、Float
ORA-55748: Escrow column is supported only on columns of types Oracle NUMBER, INTEGER, and FLOAT.
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.
只支持用户表,不支持SYSTEM表
ORA-55755: Escrow column is only supported on user tables.
ORA-55756: Escrow column is not supported on system tables.
命名 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_'
不支持分布式事务,更新语句需要包含所有主键定义列
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 的方式实现:
无论是 PolarDB-X 在秒杀场景的原理、Oracle 23c 的新特性解读,还是 MogDB 的新特性设计实现... 精彩主题,尽在 2023 数据技术嘉年华 大会!
主题 | 演讲嘉宾 | 嘉宾介绍 |
一站式、全场景数据管理与服务 | 李飞飞 | 阿里巴巴集团副总裁,阿里云数据库产品事业部负责人,ACM和IEEE会士(Fellow) |
将云原生进行到底:PolarDB 的实践和创新 | 杨辛军 | 阿里巴巴集团研究员,阿里云数据库事业部PolarDB-MySQL产品部负责人 |
Oracle Database 23c 创新特性和SQL增强 | 杨廷琨 | 云和恩墨联合创始人兼CTO |
MogDB中自治异步事务提交的设计与实现 | 王春玲 | 云和恩墨·本原数据内核研发工程师 |
数据技术嘉年华,中国数据库力量的集中展示,欢迎加入我的亲友团(邀请码一周内有效),北京欢迎你!
云和恩墨大讲堂 | 一个分享交流的地方
长按,识别二维码,加入万人交流社群
请备注:云和恩墨大讲堂
点个“在看”
你的喜欢会被看到❤
这篇关于秒杀减库存加速,Oracle 23c也学会了?从PolarDB到MogDB,尽在数据技术嘉年华!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!