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
繁體地址,請注明出處:http://hk.pswp.cn/web/83242.shtml
英文地址,請注明出處:http://en.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;//儲存在堆棧中 } 內存管理…