24-Oracle 23 ai ​Lock-Free Reservations​(无锁列值保留)

数据库领域为了解决ACID的平衡,尝试了各种锁、各种模式,
引擎技术特性、厂家实现方式各放异彩,被各种锁折磨的小伙伴,是不是感同身受。

一、数据库锁

1. 锁的类型与特点
  • 全局锁​:锁定整个数据库实例,备份期间所有写操作阻塞,业务停滞
  • 表级锁​:锁定整张表,批量操作时并发性差(如MySQL/PostgreSQL万级TPS瓶颈)
  • 行级锁​:细粒度锁定单行,但高并发下仍存在三大致命缺陷​:
    • 阻塞等待​:事务A未提交时,事务B需排队(如库存扣减场景)
    • 死锁风险​:循环等待资源(如转账场景中A等B、B等A)
    • 优先级反转​:低优先级事务持有锁时,高优先级事务被阻塞
2. ​锁的本质矛盾
安全性与并发性不可兼得​:
  • 悲观锁 →悲观锁假设并发冲突频繁发生,因此在操作数据前立即加锁,阻止其他线程访问资源,直到当前操作完成
  • 乐观锁 → 乐观锁假设并发冲突较少,操作数据时不加锁,仅在提交时检查数据是否被修改(冲突检测),高并发但需重试逻辑
3. 锁的分类

​共享锁(S锁)​​

​原理​:允许多事务并发读取同一资源,禁止写入。

​场景​:高并发查询(如报表系统),配合读已提交隔离级别避免脏读。

​排他锁(X锁)​​

​原理​:事务修改数据时独占资源,禁止其他事务读写。

​场景​:数据更新操作(如账户扣款),保障原子性。

​间隙锁(Gap Lock)​​

​原理​:锁定索引记录间的空白区间,防止新数据插入。

​场景​:可重复读隔离级别下解决幻读(如范围查询)。

​更新锁(U锁)​​

​原理​:预锁定待修改资源,避免共享锁升级为排他锁时的死锁。

​场景​:先读后写的复合操作(如“查询库存后扣减”)。

 4. 事务的隔离级别对锁的诉求又不一样

隔离级别

​锁机制​

​解决痛点​

​遗留问题​

​读未提交

写操作加X锁,读操作无锁

脏读

​读已提交​

写操作加X锁,读操作依赖MVCC

脏读

不可重复读

​可重复读​

写操作加X锁,读操作MVCC+间隙锁

不可重复读、部分幻读

未完全解决幻读

​串行化​

读写均加锁(表级或范围锁)

所有并发问题

并发性能极差

5. ​技术特性对比 

​维度​

​Lock-Free Reservations​

​传统行锁​

​乐观锁​

​锁持有时间​

仅提交瞬间(毫秒级)

整个事务周期

无锁但需重试

​并发吞吐量​

100万+ TPS(无锁竞争)

1万~10万TPS(锁竞争瓶颈)

高但重试开销大

​开发复杂度​

声明列属性即可

需处理死锁

需实现重试逻辑

二、Oracle 23 ai Lock-Free Reservations(无锁列值保留)

1. ​原理创新:日志缓冲-原子合并​
-- 声明可保留列
ALTER TABLE inv_test ADD (qty NUMBER RESERVABLE CHECK (qty >= 0));
-- 退回传统锁模式
ALTER TABLE inv_test MODIFY (qty NOT RESERVABLE);
  • 无锁操作​:对RESERVABLE列(如库存qty)的加减操作(qty = qty ± N)​不锁行,而是将增量值(如-50)写入内部日志表SYS.RESV$JOURNAL
  • ​原子提交​:事务提交时,日志值合并到原表,并自动校验约束(如qty >= 0),违反则回滚
  • 数据类型​:仅支持NUMBER/INTEGER/FLOAT(非数值列报错ORA-55748)
  • 语法限制​:必须使用±操作(直接赋值报错ORA-55746)。
  • 非保留列​:更新产品名称等非RESERVABLE列时仍触发行锁。

三、实战验证:高并发库存扣减测试​

1. ​验证脚本​
SYS@CDB$ROOT> GRANT CREATE TABLESPACE TO QC;
Grant succeeded.
SYS@CDB$ROOT> GRANT CREATE SESSION TO QC;
Grant succeeded.
SYS@CDB$ROOT> GRANT ALTER TABLESPACE, DROP TABLESPACE TO QC;
Grant succeeded.
SYS@CDB$ROOT> commit;
Commit complete.
SYS@CDB$ROOT> ALTER USER QC QUOTA UNLIMITED ON users;
User QC altered.
SYS@CDB$ROOT> commit;
QC@localhost:1521/FREEPDB1> CREATE TABLESPACE inv_ts1 DATAFILE 'inv_ts1.dbf' SIZE 100M;
TABLESPACE INV_TS1 created.
SYS@CDB$ROOT> create user QC identified by Oracle_4U;
User QC created.
SYS@CDB$ROOT> GRANT CREATE TABLE, ALTER ANY TABLE TO QC;
Grant succeeded.
[oracle@OL96 ~]$ sql QC/Oracle_4U@localhost:1521/FREEPDB1;
-- --1:启用无锁列(Oracle 23ai)
CREATE TABLE inv_test (item_id     NUMBER PRIMARY KEY,qty         NUMBER RESERVABLE CHECK (qty >= 0)  -- 关键声明
);
INSERT INTO inv_test VALUES (1, 100);
COMMIT;-- --2:并发扣减(两个会话)
-- 会话1:扣减50(不提交)
UPDATE inv_test SET qty = qty - 50 WHERE item_id=1;-- 会话2:扣减30(立即执行,无阻塞!)
UPDATE inv_test SET qty = qty - 30 WHERE item_id=1;
COMMIT;
-- 会话2先提交-- 会话1提交
COMMIT;  -- 合并日志:100-50-30=20,校验通过-- --3:结果验证
SELECT * FROM inv_test;
QC@localhost:1521/FREEPDB1> SELECT * FROM inv_test;ITEM_ID    QTY
__________ ______1     20-- --4:触发约束保护(故意超扣)
UPDATE inv_test SET qty = qty - 150 WHERE item_id=1;
-- 提交时报错ORA-02290(违反CHECK约束)
QC@localhost:1521/FREEPDB1> UPDATE inv_test SET qty = qty - 150 WHERE item_id=1;Error starting at line : 1 in command -
UPDATE inv_test SET qty = qty - 150 WHERE item_id=1
Error report -
ORA-02290: check constraint (QC.SYS_C008612) violated
Help: https://docs.oracle.com/error-help/db/ora-02290/
2. ​工作流程解析
成功失败 事务A:扣减50日志表记录-50事务B:扣减30日志表记录-30提交时合并校验约束:100-50-30=20≥0更新原表为20自动回滚
关键创新​:
- ​消除行锁竞争​:操作日志表无需锁定原表行
- ​约束驱动安全​:通过CHECK约束保证业务逻辑(如防负库存)
3. ​验证要点
  • 无阻塞​:会话2无需等待会话1提交即可执行更新
  • 约束保护​:扣减后qty<0时自动回滚。
  • 日志追溯​(DBA权限):
-- 查看-50、-30日志,Oracle 23 ai free中无此视图,DBA_EXTENDED_TXN_DETAILS,也不存在
SELECT * FROM SYS.RESV$JOURNAL WHERE table_name='inv_test';

四、适用场景和特性

1. ​最佳场景

​场景类型​

​案例​

​性能提升​

​OLTP高频更新​

库存扣减(秒杀)

并发提升10倍+

​金融交易​

账户余额实时更新

延迟降至毫秒级

​计数系统​

点赞/投票计数

无锁写入

 

2. 并发控制的新范式

Lock-Free Reservations的本质是 将锁从“数据访问层”下沉至“提交层”​,通过日志缓冲实现毫秒级锁定。
其价值在于:
  • OLTP系统​:彻底消除热点数据锁竞争,吞吐量提升10倍+。
  • 开发者体验​:无需重写应用代码,声明列属性即获性能飞跃。
  • 未来生态​:与AI Vector Search协同处理结构化+非结构化混合负载

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/83242.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding

从零写一个ALSA声卡驱动学习(1)

前言&#xff1a; 本文档描述了如何编写 ALSA&#xff08;高级 Linux 音频架构&#xff09;驱动程序。文档主要聚焦于 PCI 声卡的实现。对于其他类型的设备&#xff0c;可能会使用不同的 API。不过&#xff0c;至少 ALSA 的内核 API 是一致的&#xff0c;因此本文档在编写这些驱…

链结构与工作量证明7️⃣:用 Go 实现比特币的核心机制

链结构与工作量证明:用 Go 实现比特币的核心机制 如果你用 Go 写过区块、算过哈希,也大致理解了非对称加密、数据序列化这些“硬核知识”,那么恭喜你,现在我们终于可以把这些拼成一条完整的“区块链”。 不过别急,这一节我们重点搞懂两件事: 区块之间是怎么连接成“链”…

深入理解 React 样式方案

React 的样式方案较多,在应用开发初期,开发者需要根据项目业务具体情况选择对应样式方案。React 样式方案主要有: 1. 内联样式 2. module css 3. css in js 4. tailwind css 这些方案中,均有各自的优势和缺点。 1. 方案优劣势 1. 内联样式: 简单直观,适合动态样式和…

YOLO电力物目标检测训练

最近需要进行电力物检测相关的业务&#xff0c;因此制作了一个电力物数据集&#xff0c;使用YOLO目标检测方法进行实验&#xff0c;记录实验过程如下&#xff1a; 数据集标注 首先需要对电力物相关设备进行标注&#xff0c;这里我们选用labelme进行标注&#xff0c;使用无人机…

从阿里云域名解析异常事件看下域名解析过程

近日阿里云核心域名aliyuncs.com解析异常&#xff0c;涉及众多依赖阿里云服务的网站和应用&#xff0c;故障从发现到修复耗时5个多小时。本文简要分析下整个事件的过程&#xff0c;并分析域名解析的过程&#xff0c;了解根域名服务器在其中的作用&#xff0c;以了解。 1、aliyu…

应用分享 | 精准生成和时序控制!AWG在确定性三量子比特纠缠光子源中的应用

在量子技术飞速发展的今天&#xff0c;实现高效稳定的量子态操控是推动量子计算、量子通信等领域迈向实用化的关键。任意波形发生器&#xff08;AWG&#xff09;作为精准信号控制的核心设备&#xff0c;在量子实验中发挥着不可或缺的作用。丹麦哥本哈根大学的研究团队基于单个量…

基于规则的自然语言处理

基于规则的自然语言处理 规则方法形态还原&#xff08;针对英语、德语、法语等&#xff09;中文分词切分歧义分词方法歧义字段消歧方法分词带来的问题 词性标注命名实体分类机器翻译规则方法的问题 规则方法 以规则形式表示语言知识&#xff0c;强调人对语言知识的理性整理&am…

Vue Fragment vs React Fragment

文章目录 前言&#x1f9e9; 一、概念对比&#xff1a;Vue Fragment vs React Fragment&#x1f4e6; 二、使用示例对比✅ Vue 3 中使用 Fragment✅ React 中使用 Fragment &#x1f50d; 三、差异解析1. **使用方式**2. **传递属性&#xff08;如 key&#xff09;**3. **插槽系…

3D图像渲染和threejs交互坐标系入门知识整理

1. Games101 b站上面就有&#xff0c;看到第9节课基本对于图形渲染的原理和渲染过程有所了解。然后就可以使用openGL和GLSL。 点输入->投影到二维&#xff08;生成三角形面&#xff09;->光栅化为像素->z-buffer深度缓存判断层级->着色shading 2. openGL和GLSL 参…

跨平台架构区别

文章目录 重编译时轻运行时&#xff08;uniapp&#xff09;轻编译时重运行时&#xff08;Taro&#xff09; 重编译时轻运行时&#xff08;uniapp&#xff09; 对 vue 语法直接进行编译转换成对应平台代码&#xff0c;再通过添加运行时代码去补充能力&#xff0c;比如 nextTick…

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…

HarmonyOS 应用开发学习记录 - 从Windows开发者视角看鸿蒙开发

起始 2024年6月21日召开的华为开发者大会2024上宣布Harmony OS NEXT&#xff08;即鸿蒙星河版&#xff09;面向开发者启动Beta版&#xff0c;这也被人们称为“纯血鸿蒙”&#xff0c;它基于鸿蒙内核&#xff0c;不再兼容安卓开发的APP应用。 时至今日近一年了&#xff0c;我也有…

MySQL 事务管理与锁优化:确保数据一致性和并发性

在多用户并发访问的数据库系统中,如何确保数据的**一致性(Consistency)和并发性(Concurrency)**是一个核心挑战。**事务(Transaction)和锁(Lock)**是 MySQL 应对这一挑战的两大利器。事务保证了操作的原子性、一致性、隔离性和持久性,而锁机制则在并发环境下协调不同…

OpenPrompt 有没有实现连续提示词和提手动示词一起优化的

OpenPrompt 有没有实现连续提示词和提手动示词一起优化的 OpenPrompt 中连续提示词与手动提示词的混合优化 OpenPrompt 确实支持同时优化连续提示词(Soft Prompt)和手动设计的离散提示词(Manual Prompt)。这种混合优化策略可以结合两者的优势: 连续提示词:通过梯度下降…

Android添加语言列表

方式一 frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\DatabaseHelper.java Settings.System.putString(context.getContentResolver(),Settings.System.SYSTEM_LOCALES, "ru-RU,en-US"); 方式2 packages/apps/Settings/src/co…

解决uniapp开发app map组件最高层级 遮挡自定义解决底部tabbar方法

subNvue&#xff0c;是 vue 页面的原生子窗体&#xff0c;把weex渲染的原生界面当做 vue 页面的子窗体覆盖在页面上。它不是全屏页面&#xff0c;它给App平台vue页面中的层级覆盖和原生界面自定义提供了更强大和灵活的解决方案。它也不是组件&#xff0c;就是一个原生子窗体。 …

如何保障服务器的安全

如何保障服务器的安全 以下是保障服务器安全的核心措施及实施建议&#xff1a; 一、基础设施层防护 物理安全 机房设置防火/防水/防雷系统&#xff0c;部署门禁监控设备。 服务器固定于抗震机架&#xff0c;避免物理损坏。 网络防护 防火墙规则&#xff1a;仅开放业务必要端…

C语言 学习 C程序的内存模型 2025年6月10日08:55:13

堆栈与内存管理 堆栈(Stack) : 后进先出(LIFO) 线性数据结构 包含压栈(Push) ,弹栈(Pop) 用途:临时存储数据(函数调用,局部变量) 管理:由系统自动分配和回收 速度快 ,容量有限! 堆栈代码示例: //堆栈示例 :局部变量 void getText() {int text20;//储存在堆栈中 } 内存管理…