【Oracle篇】偽列之Version Query:全鏈路追蹤行數據變更的所有記錄(不僅僅是被修改的最后時間)(第二篇,總共六篇)

💫《博主主頁》:
   🔎 CSDN主頁__奈斯DB
   🔎 IF Club社區主頁__奈斯、
🔥《擅長領域》:擅長阿里云AnalyticDB for MySQL(分布式數據倉庫)、Oracle、MySQL、Linux、prometheus監控;并對SQLserver、NoSQL(Redis)有了解
💖如果覺得文章對你有所幫助,歡迎點贊收藏加關注💖

在這里插入圖片描述
????話接上文,在上文中了解了通過ORA_ROWSCN偽列可以精準定位行數據的最后修改時間?。但是如果有這樣一個場景,不僅想知道行數據被修改的時間,還想知道修改前的舊值,以及這行數據被修改了多少次,需要進行數據追溯,那這個有沒有辦法實現的呢🔍?
????Oracle表示:"當然可以!"? 通過 閃回版本查詢(Flashback Version Query)的偽列 就可以輕松實現:

  • VERSIONS_STARTTIME/VERSIONS_STARTSCN - 版本開始時間/SCN
  • VERSIONS_ENDTIME/VERSIONS_ENDSCN - 版本結束時間/SCN
  • VERSIONS_XID - 創建該版本的事務ID(追蹤!🕵?♂?)
  • VERSIONS_OPERATION - 操作類型(I/U/D)🔧

????不過需要注意的是?? ,這個功能依賴 UNDO表空間 中的數據,必須在UNDO_RETENTION參數保留期內查詢(默認通常15分鐘~24小時),但實際保留時間還取決于UNDO表空間大小📊,那么下面開始版本查詢偽列的介紹。
????在Oracle 12c官方文檔中可查的的偽列總共有 10個 ,對于網上的博客,以及其他學習資料對偽列的介紹都非常少,幾乎沒有大佬去講關于偽列的內容,那么博主將用一個系列去認真介紹一下這 10個 偽列。先介紹一下偽列,偽列也叫虛擬列、特殊列、隱式列,不管怎么稱呼,都泛指偽列。偽列是Oracle中一種特殊的列,它不像普通列那樣存儲在表中,但可像普通列一樣在查詢中進行引用,在查詢時由數據庫動態生成,主要用于獲取行標識、序列值、數據操作相關元數據等特殊信息。需要注意的是偽列只能進行查詢,不能插入、更新或刪除它們的值。偽列類似于無參數的函數,但無參數函數通常對結果集中的每一行返回相同值,而偽列通常為每一行返回不同的值。對于比較常用的偽列將用獨立的一篇文章介紹,對于不常用的偽列將用一篇文章簡單介紹清楚其用途即可,因為在實際工作中有幾個偽列使用的很頻繁,真的非常有用處,關于偽列的系列文章如下:

  • 第一篇:偽列之ORA_ROWSCN:精準查看行數據被修改的最后時間
  • 第二篇:偽列之Version Query:全鏈路追蹤行數據變更的所有記錄(不僅僅是被修改的最后時間)(當前篇)
  • 第三篇:偽列之Sequence:利用CURRVAL和NEXTVAL實現主鍵自增(含 12c 新特性通過 Identity 列實現主鍵自增)
  • 第四篇:偽列之ROWID:快速查找數據行的物理地址
  • 第五篇:偽列之ROWNUM:分頁查詢的實現
  • 第六篇:偽列之Hierarchical Query(層次查詢)、COLUMN_VALUE(列值提取)、OBJECT_ID(對象標識)、OBJECT_VALUE(對象值訪問)、XMLDATA(XML原始數據)

???

特別說明💥:本篇文章部分理論性知識點均來源于版權歸 Oracle 所有的官方公開文檔手冊,并結合了我個人的解讀和案例演示。若需要調整,請聯系,會盡快處理😄
???
官方文檔對于版本查詢偽列的介紹(Oracle 12c):
Version Query Pseudocolumns
在這里插入圖片描述


目錄

    • 一、版本查詢偽列介紹:
    • 二、版本查詢偽列 VS ORA_ROWSCN偽列
      • 案例一:創建表,針對多次被修改的某行數據通過版本查詢偽列查看更改時間,以及修改前后的數據
      • 案例二:在現存表上使用版本查詢偽列,針對多次被修改的某行數據通過版本查詢偽列查看更改時間,以及修改前后的數據


???
???

一、版本查詢偽列介紹:

????版本查詢偽列僅在閃回版本查詢(Flashback Version Query)中有效,閃回版本查詢是閃回查詢(Flashback Query)中的一種。
????既然版本查詢偽列和閃回功能有關,那么先介紹一下Oracle中的閃回功能。Oracle中有多種閃回功能。包括Flashback Database(閃回數據庫)、Flashback Drop(回收站)、Flashback Query(閃回查詢)、flashback Table(閃回表)、Flashback Data Archive(閃回數據歸檔)。在Flashback Query(閃回查詢)中又分為閃回查詢(Flashback Query)、閃回版本查詢(Flashback Version Query)、閃回事務查詢(Flashback Transaction Query),關于閃回功能在這里不多贅述,官方文檔鏈接參考(Oracle 12c):19 Using Oracle Flashback Technology ,如下是不同閃回功能的對比矩陣:
在這里插入圖片描述

功能依賴組件 / 參數粒度保留期典型用途
Flashback QueryUndo數據 / undo_retention行級undo_retention單點數據查看
Flashback Version QueryUndo數據 / undo_retention行版本級undo_retention變更歷史追蹤
Flashback Transaction QueryUndo+Flashback日志 / undo_retention事務級undo_retention事務分析
Flashback TableUndo數據 / undo_retention表級undo_retention表數據回退
Flashback Drop回收站 / recyclebin對象級空間壓力決定表刪除恢復
Flashback Database閃回日志 / db_flashback_retention_target數據庫級日志保留策略數據庫級回滾
Flashback Data Archive獨立表空間行級用戶定義(年)合規性存檔

????清楚了Oracle有哪些閃回功能,并且清楚了版本查詢偽列僅在閃回版本查詢(Flashback Version Query)中有效,那么之后的內容圍繞Version Query Pseudocolumns(版本查詢偽列)和閃回版本查詢(Flashback Version Query)進行介紹。
???

版本查詢偽列包括如下:

偽列描述
VERSIONS_STARTSCN 和 VERSIONS_STARTTIME功能:標識行版本創建時的起始系統變更號(SCN)或時間戳(TIMESTAMP)

說明:該偽列標識數據首次具有行版本中反映的值的時間點。可用于確定Oracle閃回表或Oracle閃回查詢的過去目標時間

特殊值:如果該偽列為NULL,則表示行版本在查詢開始前就已存在
VERSIONS_ENDSCN 和 VERSIONS_ENDTIME功能:標識行版本失效時的SCN或時間戳

特殊值:如果該偽列為NULL,則表示行版本在查詢時仍為當前版本,或者該行對應于刪除操作
VERSIONS_XID功能:創建該行版本的事務標識符(RAW格式的數字)
VERSIONS_OPERATION功能:事務執行的操作類型:
????·'I'表示插入(insertion)
????·'D'表示刪除(deletion)
????·'U'表示更新(update)

說明:行版本反映的是:
????·插入操作后的行(INSERT)
????·刪除操作前的行(DELETE)
????·更新操作影響的行(UPDATE)

注意:對于索引鍵的用戶更新操作,Oracle閃回版本查詢可能會將一個UPDATE操作視為兩個操作(DELETE加INSERT),表現為兩個版本行:先是一個’D’操作,隨后是一個’I’操作(通過VERSIONS_OPERATION標識)
???

閃回版本查詢語法介紹:
????使用Oracle閃回版本查詢(Flashback Version Query)可檢索指定時間區間內特定行存在的不同版本。每次執行COMMIT語句時,都會生成一個行版本。需要注意:執行CREATE TABLE語句后,請至少等待15秒再提交任何事務,以確保Oracle閃回版本查詢(Flashback Version Query)能夠正確反映這些事務變更。
????使用SELECT語句的VERSIONS BETWEEN子句指定Oracle閃回版本查詢(Flashback Version Query)。語法格式如下:

SELECT [偽列],1,2, ...FROM 表名 VERSIONS BETWEEN { SCN | TIMESTAMP } start AND end
[WHERE 條件];參數說明:startend分別代表要查詢時間區間的起始點和結束點表達式。該時間區間為閉區間[包含startend時刻]

????Oracle 閃回版本查詢會返回一個數據表,其中包含指定時間區間內存在過的每一個行版本所對應的記錄。該結果表中的每一行都包含描述行版本元數據的偽列,通過這些信息,您可以追溯數據庫中特定變更(可能是錯誤操作)的發生時間及操作方式。需要注意:閃回版本查詢依賴 UNDO表空間 中的數據,必須在UNDO_RETENTION參數保留期內查詢(默認通常15分鐘~24小時),但實際保留時間還取決于UNDO表空間大小

???
???

二、版本查詢偽列 VS ORA_ROWSCN偽列

????ORA_ROWSCN偽列用于查看行數據被修改的最后時間,經過上面的介紹清楚了版本查詢偽列主要也是追蹤數據變更,只不過版本查詢偽列可以查到行數據變更的所有記錄(不僅是被修改的最后時間),因此這里簡單介紹一下這兩個在功能和使用場景上有顯著差異:
???

版本查詢偽列:

  • 用途: 用于閃回版本查詢(Flashback Version Query),追蹤行級數據的歷史變更
  • 主要偽列:
    • VERSIONS_STARTTIME/VERSIONS_STARTSCN - 版本開始時間/SCN
    • VERSIONS_ENDTIME/VERSIONS_ENDSCN - 版本結束時間/SCN
    • VERSIONS_XID - 創建該版本的事務ID
    • VERSIONS_OPERATION - 操作類型(I/U/D)
  • 特點:
    • 需要顯式使用 VERSIONS BETWEEN 語法
    • 提供完整的行變更歷史記錄
    • 可以查看中間版本(而不僅是最后修改)
    • 依賴于UNDO數據,有時間限制

???

ORA_ROWSCN偽列:

  • 用途: 提供行最后修改的SCN(系統變更號)
  • 特點:
    • 直接附加在普通查詢中
    • 每行一個SCN值(最后修改的SCN)
    • 默認基于塊級(block-level)而非行級(row-level)
    • 需要表創建時指定 ROWDEPENDENCIES 才能實現行級精度

???

主要區別對比:

特性Version Query PseudocolumnsORA_ROWSCN
粒度行級變更歷史行/塊級最后修改SCN
數據源UNDO數據數據塊頭信息
時間范圍需要指定時間/SCN范圍總是顯示當前行最后的SCN
精度精確到每次變更精確到每次變更
使用場景審計、數據恢復、歷史分析樂觀鎖、變更檢測
DDL影響表結構變更會導致ORA-01466不受表結構變更影響
兩者結合使用,先用ORA_ROWSCN定位可疑行,再用Version Query分析詳細變更歷史

???
???

案例一:創建表,針對多次被修改的某行數據通過版本查詢偽列查看更改時間,以及修改前后的數據

(1)查看liu_jybq_org_medical表結構,創建liu_jybq_org_medical_VQ新表

SQL> create table liu_jybq_org_medical_VQ
(id                  VARCHAR2(32) not null,region_id           VARCHAR2(32) not null,hospital_short_name VARCHAR2(600),hospital_full_name  VARCHAR2(600),hospital_type_code  VARCHAR2(64) not null,hospital_type_name  VARCHAR2(200),hospital_name_py    VARCHAR2(800),hospital_class_code VARCHAR2(64),hospital_class_name VARCHAR2(200),hospital_grade_code VARCHAR2(64),hospital_grade_name VARCHAR2(120),hospital_fixed_flag VARCHAR2(4),special_subject     VARCHAR2(2000),hospital_property   VARCHAR2(4),linkman_person      VARCHAR2(600),linkman_way         VARCHAR2(200),hospital_addr       VARCHAR2(2000),bank_name           VARCHAR2(200),bank_account        VARCHAR2(200),organization_code   VARCHAR2(18),hospital_location   VARCHAR2(32),hospital_profile    VARCHAR2(2000),hospital_pictures   VARCHAR2(100),remark              CLOB,del_flag            VARCHAR2(4) not null,create_user_id      VARCHAR2(32) not null,create_date         TIMESTAMP(6) not null,update_user_id      VARCHAR2(32) not null,update_date         TIMESTAMP(6) not null,region_code         VARCHAR2(10),hospital_code       VARCHAR2(50),is_high_risk        VARCHAR2(10),high_risk_reason    VARCHAR2(1000)
);   -- 不指定參數默認塊級別,相關參數為NOROWDEPENDENCIESSQL> insert into liu_jybq_org_medical_VQ select * from liu_jybq_org_medical;
SQL> commit;

???

(2)查看特定數據的ORA_ROWSCN偽列,并轉換為時間戳時

SQL>
SELECT  t1.id,t1.region_id,t1.remark,t1.hospital_name_py,t1.hospital_type_name,to_char(scn_to_timestamp(ORA_ROWSCN), 'YYYY-MM-DD HH24:MI:SS'),dbms_rowid.rowid_relative_fno(rowid) datafile_ID,dbms_rowid.rowid_block_number(rowid) block_number
FROM liu_jybq_org_medical_VQ t1
where id='00345C56B7514B3EA0F996DCFF8A0824';

在這里插入圖片描述
對特定數據進行多次更新后再查看ORA_ROWSCN偽列,并轉換為時間戳時

SQL> update liu_jybq_org_medical_VQ set hospital_type_name='社區醫療站' where id='00345C56B7514B3EA0F996DCFF8A0824'; 
SQL> COMMIT;SQL> update liu_jybq_org_medical_VQ set hospital_type_name='鄉鎮衛生所' where id='00345C56B7514B3EA0F996DCFF8A0824'; 
SQL> COMMIT;SQL>
SELECT  t1.id,t1.region_id,t1.remark,t1.hospital_name_py,t1.hospital_type_name,to_char(scn_to_timestamp(ORA_ROWSCN), 'YYYY-MM-DD HH24:MI:SS'),dbms_rowid.rowid_relative_fno(rowid) datafile_ID,dbms_rowid.rowid_block_number(rowid) block_number
FROM liu_jybq_org_medical_VQ t1
where id='00345C56B7514B3EA0F996DCFF8A0824';

可以看到了相關行數據的更新時間,但對于ORA_ROWSCN偽列而言只能看到行數據被修改的最后時間,并不能看到其他時間被修改的具體情況,那么這時候就需要使用到了版本查詢偽列
在這里插入圖片描述
???

(2)使用版本查詢偽列,查看行數據多次執行的情況,以及修改前后的數據
基于時間范圍的查詢:

SQL>
SELECT 
versions_starttime AS change_time,        --- 版本開始時間/SCN
versions_endtime AS end_time,             --- 版本結束時間/SCNversions_xid AS transaction_id,           --- 創建該版本的事務IDversions_operation AS operation,          --- 操作類型(I/U/D)hospital_type_name AS new_hospital_type_name     --- 該行版本中的當前值
FROM liu_jybq_org_medical_VQ
VERSIONS BETWEEN TIMESTAMP 
TO_TIMESTAMP('2025-08-14 18:18:00', 'YYYY-MM-DD HH24:MI:SS') AND 
TO_TIMESTAMP('2025-08-14 18:20:00', 'YYYY-MM-DD HH24:MI:SS')
where id='00345C56B7514B3EA0F996DCFF8A0824'
ORDER BY 
versions_starttime desc nulls last;

???

基于SCN的查詢:

SQL>
SELECT 
versions_starttime AS change_time,        --- 版本開始時間/SCN
versions_endtime AS end_time,             --- 版本結束時間/SCNversions_xid AS transaction_id,           --- 創建該版本的事務IDversions_operation AS operation,          --- 操作類型(I/U/D)hospital_type_name AS new_hospital_type_name     --- 該行版本中的當前值
FROM liu_jybq_org_medical_VQ
VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE
where id='00345C56B7514B3EA0F996DCFF8A0824'
ORDER BY 
versions_starttime desc nulls last;

通過閃回版本查詢語句配合版本查詢偽列可以查出特定hospital_type_name行字段的數據更新情況,從“幸福社區站 —> 社區醫療站 —> 鄉鎮衛生所”,使用降序將最新數據情況放在最前面
在這里插入圖片描述

???
???

案例二:在現存表上使用版本查詢偽列,針對多次被修改的某行數據通過版本查詢偽列查看更改時間,以及修改前后的數據

(1)查看liu_jybq_org_medical業務表特定數據的ORA_ROWSCN偽列,并轉換為時間戳時

SQL>
SELECT  t1.id,t1.region_id,t1.remark,t1.hospital_name_py,t1.hospital_type_name,to_char(scn_to_timestamp(ORA_ROWSCN), 'YYYY-MM-DD HH24:MI:SS'),dbms_rowid.rowid_relative_fno(rowid) datafile_ID,dbms_rowid.rowid_block_number(rowid) block_number
FROM liu_jybq_org_medical t1
where id='004138D1DD804D0EA8F6929E15A4480D';

liu_jybq_org_medical是一個創建很久的業務表,并且有段時間沒有更新數據了。如果查看特定數據的ORA_ROWSCN偽列,并轉換為時間戳時,會拋出如下錯誤。這是因為Oracle僅會在有限時間內保留SCN(系統變更號)與其生成時間戳的映射關系,SCN(系統變更號)與其生成時間戳的映射保留時間取的是undo數據覆蓋時間和閃回歸檔保留期的最大值,不管取值如何,scn_to_timestamp函數定義了強制最低保留時間限制,SCN 與時間戳的關聯信息最少會保留 120 小時(5 天)
在這里插入圖片描述
對特定數據進行多次更新后再查看ORA_ROWSCN偽列,并轉換為時間戳時

SQL> update liu_jybq_org_medical set hospital_type_name='社區醫療站' where id='004138D1DD804D0EA8F6929E15A4480D'; 
SQL> COMMIT;SQL> update liu_jybq_org_medical set hospital_type_name='鄉鎮衛生所' where id='004138D1DD804D0EA8F6929E15A4480D'; 
SQL> COMMIT;SQL>
SELECT  t1.id,t1.region_id,t1.remark,t1.hospital_name_py,t1.hospital_type_name,to_char(scn_to_timestamp(ORA_ROWSCN), 'YYYY-MM-DD HH24:MI:SS'),dbms_rowid.rowid_relative_fno(rowid) datafile_ID,dbms_rowid.rowid_block_number(rowid) block_number
FROM liu_jybq_org_medical t1
where id='004138D1DD804D0EA8F6929E15A4480D';

可以看到了相關行數據的更新時間,但對于ORA_ROWSCN偽列而言只能看到行數據被修改的最后時間,并不能看到其他時間被修改的具體情況,那么這時候就需要使用到了版本查詢偽列
在這里插入圖片描述
???

(2)使用版本查詢偽列,查看行數據多次執行的情況,以及修改前后的數據
基于時間范圍的查詢:

SQL>
SELECT 
versions_starttime AS change_time,        --- 版本開始時間/SCN
versions_endtime AS end_time,             --- 版本結束時間/SCNversions_xid AS transaction_id,           --- 創建該版本的事務IDversions_operation AS operation,          --- 操作類型(I/U/D)hospital_type_name AS new_hospital_type_name     --- 該行版本中的當前值
FROM liu_jybq_org_medical
VERSIONS BETWEEN TIMESTAMP 
TO_TIMESTAMP('2025-08-14 18:20:00', 'YYYY-MM-DD HH24:MI:SS') AND 
TO_TIMESTAMP('2025-08-14 18:25:00', 'YYYY-MM-DD HH24:MI:SS')
where id='004138D1DD804D0EA8F6929E15A4480D'
ORDER BY 
versions_starttime desc nulls last;

???

基于SCN的查詢:

SQL>
SELECT 
versions_starttime AS change_time,        --- 版本開始時間/SCN
versions_endtime AS end_time,             --- 版本結束時間/SCNversions_xid AS transaction_id,           --- 創建該版本的事務IDversions_operation AS operation,          --- 操作類型(I/U/D)hospital_type_name AS new_hospital_type_name     --- 該行版本中的當前值
FROM liu_jybq_org_medical
VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE
where id='004138D1DD804D0EA8F6929E15A4480D'
ORDER BY 
versions_starttime desc nulls last;

通過閃回版本查詢語句配合版本查詢偽列可以查出特定hospital_type_name行字段的數據更新情況,從“其他 —> 社區醫療站 —> 鄉鎮衛生所”,使用降序將最新數據情況放在最前面
在這里插入圖片描述


總結與最佳實踐
????閃回版本查詢為Oracle用戶提供了強大的數據追溯能力,通過 VERSIONS_* 偽列可精準還原行數據變更軌跡,如同數據庫的"時間機器"?。使用時需注意:
1?? 時效性:盡早查詢,避免UNDO數據因空間壓力或超出UNDO_RETENTION期限被覆蓋
2?? 擴展性:對于長期審計需求,建議結合閃回數據歸檔(Flashback Data Archive)實現歷史數據永久保存

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/96271.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/96271.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/96271.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

代理模式深度解析:從靜態代理到 Spring AOP 實現

代理模式是軟件開發中一種經典的設計模式,它通過引入 "代理對象" 間接訪問目標對象,從而在不修改目標對象代碼的前提下,實現功能增強(如日志記錄、事務管理)、權限控制等橫切需求。從簡單的靜態代理到靈活的…

算法 ----- 鏈式

目錄 一 、鏈式 二 、題目 1、兩兩相加 (1)題目 (3) 代碼書寫 2、兩兩交換鏈表中的節點 (1)題目 (2) 解題思路 (3)代碼書寫 3、重排鏈表 (1)題目 …

運維監控prometheus+grafana

目錄 一、環境 二、Node_exporter部署 三、Prometheus部署 四、Grafana部署 五、驗證、使用 一、環境 系統使用CentOS7虛擬機。 監控三臺服務器: 192.168.114.10 Node1 #部署Prometheus、node_exporter、Grafana 192.168.114.20 Node2 …

數字孿生 :提高制造生產力的智能方法

近年來,在先進數字技術深度整合的推動下,制造業經歷了深刻變革。數字孿生技術作為其中最具前景的創新之一,正重塑工廠和生產流程的設計、監控和優化方式。該技術的核心在于為物理資產、系統或流程創建虛擬映射。這種虛擬映射實時同步現實世界…

【論文閱讀】-《SIGN-OPT: A QUERY-EFFICIENT HARD-LABEL ADVERSARIAL ATTACK》

Sign-OPT: 一種查詢高效的硬標簽對抗攻擊 原文鏈接:https://arxiv.org/pdf/1909.10773 摘要 我們研究在訪問受限情況下評估機器學習系統對抗魯棒性的最實用問題設置:用于生成對抗樣本的硬標簽黑盒攻擊設置,其中允許有限的模型查詢&#xff…

安卓11 12系統修改定制化_____如何去掉 搜狗輸入法 首次運行時權限授權彈窗 其他應用可借鑒

有些內置應用或者第三方應用在首次使用時會跳出權限允許彈窗。雖然這個是系統為了用戶安全設置的一道檢測機制。但無形之中會影響到定制類用戶的使用。那么能不能去除這個首次運行的權限彈窗呢。其實也有多方法可參閱解決。 通過博文了解?????? 1??????-----首次…

雙環模型:一個蘊含安全哲學的類設計解析

雙環模型:一個蘊含安全哲學的類設計解析 在編程世界中,優秀的類設計不僅能實現功能需求,更能體現開發者對系統本質的理解。本文將深入剖析一個看似簡單卻蘊含深刻安全哲學的OP類,探討其雙環模型背后的設計思想與實踐價值。 類結構…

牛津大學xDeepMind 自然語言處理(4)

牛津大學xDeepMind 自然語言處理 Natural Language Processing 語音識別 Speech Recognition語音識別概述 問題定義:自動語音識別(ASR)、文本到語音合成(TTS)等相關任務:說話人識別、語音增強、語音分離等語…

MyBatis處理SQL語句映射

基礎MyBatis問題以去看MyBatis基礎。 使用log4j設置日志在控制臺打印SQL語句及其執行信息 也可以使用MyBatis基礎中用的slf4j。 在pom.xml文件中引入log4j坐標依賴 <dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><…

嵌入式硬件篇---麥克納姆輪軌跡偏移

麥克納姆輪的軌跡偏移是機械結構、驅動系統、控制邏輯及外部環境等多因素共同作用的結果&#xff0c;其核心是各輪子的驅動力 / 運動狀態無法按理論模型實現協同&#xff0c;導致車體實際運動與期望軌跡產生偏差。以下是具體影響因素的詳細分析&#xff1a;一、機械結構偏差&am…

C語言安全函數分享

在日常寫程序中有一些功能函數是可以重復使用的&#xff0c;在c語言的標準庫里面也有對應的功能函數&#xff0c;但是那些功能函數有會有小問題然后我就整理了一下對應功能的安全函數的使用。其中前四個函數可以編譯成一個動態庫&#xff0c;然后在項目工程中只需要包含對應的頭…

汽車之家聯合HarmonyOS SDK,深度構建鴻蒙生態體系

汽車之家作為一家領先的汽車互聯網公司&#xff0c;致力于打造服務全球的汽車生態科技平臺&#xff0c;覆蓋"看選買用換"的一站式購車體驗。2023年12月底&#xff0c;汽車之家正式啟動鴻蒙開發&#xff0c;并于2024年年底成功構建了完整的鴻蒙生態體系&#xff0c;涵…

深度學習驅動的訂單簿分析與交易策略優化

訂單簿數據特征與預處理方法 高頻金融數據中&#xff0c;訂單簿&#xff08;Order Book&#xff09;承載著市場參與者的實時交易意圖。不同于K線數據的聚合特性&#xff0c;訂單簿數據具有獨特的時空特征&#xff1a; 多維層級結構&#xff1a;包含不同價格檔位的買賣盤深度信息…

Redis--day9--黑馬點評--分布式鎖(二)

&#xff08;以下所有內容全部來自上述課程&#xff09; 分布式鎖 1. Redisson功能介紹 基于setnx實現的分布式鎖存在下面的問題&#xff1a; 不可重入&#xff1a;同一個線程無法多次獲取同一把鎖不可重試&#xff1a;獲取鎖只嘗試一次就返回false&#xff0c;沒有重試機…

ES入門教程 (python 版)

ES入門教程 1. 創建ES對象from elasticsearch import Elasticsearch # 實例化一個ip為localhost&#xff0c;端口為9200&#xff0c;允許超時一小時的es對象 es Elasticsearch(hosts"localhost",port9200,timeout3600) # 1. 創建 索引 index_name "test"…

Gateway中Forward配置+源碼觀賞

系列文章目錄 文章目錄系列文章目錄一、ForwardPathFilter二、RouteToRequestUrlFilter三、ForwardRoutingFilteryaml forward配置gateway:routes:- id: user-route # uri: lb://useruri: forward:///user/indexpredicates:- Path/user/**- YoGET # filt…

BAS16XV2T1G ON安森美半導體 高速開關二極管 電子元器件IC

BAS16XV2T1G ON Semiconductor 高速開關二極管專業解析1. 產品技術檔案BAS16XV2T1G是安森美半導體(ON Semiconductor)推出的高速開關二極管&#xff0c;采用SOT-523超微型封裝&#xff08;1.60.80.95mm&#xff09;&#xff0c;專為現代高密度電子設備設計&#xff0c;以其超快…

親測可用 [安卓]《神秘來電》V1.1無需登入無廣告離線打開即用手機模擬發起虛假來電免費版

神秘來電是一款可以模擬虛擬電話的應用程序&#xff0c;它能夠在用戶需要的時候模擬各種來電&#xff0c;以便用戶能夠在尷尬的場合脫身。用戶可以預設多個不同的來電號碼和鈴聲&#xff0c;并可隨時觸發這些虛擬電話&#xff0c;在特殊情況下幫助用戶擺脫尷尬。它為那些社交恐…

8.20 dp

lc73矩陣置零queue隊列標記// 整行置零for(int y0; y<n; y) matrix[i][y] 0; // 整列置零for(int x0; x<m; x) matrix[x][j] 0; class Solution { public:void setZeroes(vector<vector<int>>& matrix) {int m matrix.size(), n matrix[0].size();//…

STL庫——string(類模擬實現)

? ? ? ? ? づ?ど &#x1f389; 歡迎點贊支持&#x1f389; 個人主頁&#xff1a;勵志不掉頭發的內向程序員&#xff1b; 專欄主頁&#xff1a;C語言&#xff1b; 文章目錄 前言 一、基本框架 二、構造函數 三、析構函數 四、拷貝構造 五、運算符重載 5.1、賦值重載 5.2…