海山数据库(He3DB)源码详解:CommitTransaction函数源码详解

TI官方PSpice for TI安装避坑指南:从申请Key到解决器件搜索栏空白(附详细步骤) 本文详细介绍了PSpice for TI的安装与配置全流程,包括申请Key、解决器件搜索栏空白等常见问题。通过分步指南和实战避坑技巧,帮助工程师高效完成安装并优化性能,确保电路仿真工具的正常使用。 阅读详情

海山数据库(He3DB)源码详解:CommitTransaction函数

本文介绍了事务提交过程中,具体执行提交任务的CommitTransaction函数详细执行流程。

1. 执行条件

  1. 当事务处于TRANS_INPROGRESS状态且事务块处于TBLOCK_STRATED或者TBLOCK_END状态下,由CommitTransactionCommand函数调用CommitTransaction函数完成提交事务。
  2. 在ParallelWorkerMain函数中由EndParallelWorkerTransaction调用。

2. 执行过程

2.1 获取当前节点状态:

获得当前节点变量值CurrentTransactionState,

并创建两个临时变量latestXid和is_parallel_worker。

    TransactionState s = CurrentTransactionState;
    TransactionId latestXid;
    bool		is_parallel_worker;
  1. CurrentTransactionState主要保存了当前事务状态相关的参数,主要是事务状态、事务块状态、XID、保存点、父节点等级等一系列参数。
  2. latestXid用来传递保存XID值。
  3. is_parallel_worker主要用于判断当前事务是否使用并行执行(并行执行指的是数据库将某些查询操作分布到多个工作进程中执行,以提高性能)。

2.2 检查当前状态:

检查并行执行模式,检查当前事务状态并判断父节点状态。

    /* Enforce parallel mode restrictions during parallel worker commit. */
    if (is_parallel_worker)
        EnterParallelMode();

    ShowTransactionState("CommitTransaction");

    /*
    * check the current transaction state
    */
    if (s->state != TRANS_INPROGRESS)
        elog(WARNING, "CommitTransaction while in %s state",
                TransStateAsString(s->state));
    Assert(s->parent == NULL);
  1. 如果执行并行执行模式,调用EnterParallelMode函数执行++s->parallelModeLevel。
  2. 检查当前事务状态,如果不是TRANS_INPROGRESS,则执行elog函数保存并返回主线程PostgreMain,执行Abort过程。
  3. 断言检查当前父节点状态,出错直接退出(调试用的)。

2.3 预提交处理:

第一、通过死循环处理用户定义的一些延迟触发器和一些portal操作。

    for (;;)
    {
        /*
        * Fire all currently pending deferred triggers.
        */
        AfterTriggerFireDeferred();

        /*
        * Close open portals (converting holdable ones into static portals)
        * If there weren't any, we are done. otherwise loop back to check
        * if they queued deferred triggers.  Lather, rinse, repeat.
        */
        if (!PreCommit_Portals(false))
            break;
    }

这里的死循环行为是:因为,事务(增删改)操作完成之后会触发定义的延迟触发器,进行一些其他的行为,而这些其他行为中可能会包括游标的增删改查,导致了一个套娃操作。所以,这里的AfterTriggerFireDeferred函数处理延迟触发器,PreCommit_Portals处理游标,直到触发器处理完且没有游标需要处理,跳出函数。

  1. 不断调用AfterTriggerFireDeferred函数,在当前事务提交之前调用,执行并处理掉所有待处理的延迟触发器。
  2. 通过判断PreCommit_Portals函数的执行结果,来选择是否跳出死循环。PreCommit_Portals函数的作用,首先是将本次事务过程中的持久化游标物质化,并关闭游标对应需要的执行器,释放持有的锁;然后关闭本次事务过程中的一些非持久门户(Non-holdable portals),其他事务留存下来的持久性门户(Portals)不做改变。如果游标没有做任何操作,即该事务没有其他游标操作,返回false,否则返回true。

持久化游标物质化是指将持久化游标的结果集存储到磁盘或内存中,确保之后的游标查询结果不受后续事务操作对数据的影响。

第二、通过回调函数关闭参数对应的事务内部服务。

    CallXactCallbacks(is_parallel_worker ? XACT_EVENT_PARALLEL_PRE_COMMIT
                        : XACT_EVENT_PRE_COMMIT);

第三、清理并行执行的资源,清理所有的触发器。

    /* If we might have parallel workers, clean them up now. */
    if (IsInParallelMode())
        AtEOXact_Parallel(true);

    /* Shut down the deferred-trigger manager */
    AfterTriggerEndXact(true);

第四、在关闭游标后调用PreCommit_on_commit_actions函数。

执行ON COMMIT子句定义的行为,包括对临时表的处理和游标的处理等,确保之前的游标都被正确的关闭,不会造成悬空引用(类似于悬空指针)。

    /*
    * Let ON COMMIT management do its thing (must happen after closing
    * cursors, to avoid dangling-reference problems)
    */
    PreCommit_on_commit_actions();

第五、调用smgrDoPendingSyncs函数和AtEOXact_LargeObject函数。

    /*
    * Synchronize files that are created and not WAL-logged during this
    * transaction. This must happen before AtEOXact_RelationMap(), 
    * so that we don't see committed-but-broken files after a crash.
    */
    smgrDoPendingSyncs(true, is_parallel_worker);

    /* close large objects before lower-level cleanup */
    AtEOXact_LargeObject(true);
  1. smgrDoPendingSyncs函数会在当前事务期间,对那些被创建且其更改没有记录在 WAL(Write-Ahead Logging)日志中的文件进行同步。这是为了确保如果发生崩溃,这些文件的状态是一致的,并且不会留下已提交但损坏的文件。

  2. AtEOXact_LargeObject函数主要是清理一些超出常规字段所能存储限制的“大对象”,关闭与大型对象关联的文件描述符(LO fds),并清空 cookie 数组。

    这样做的结果是,这些文件描述符将不再有效,无法再被用来访问或操作大型对象。无论事务是提交还是中止,持有这些 LO fds 的内存上下文和资源所有者在事务结束时都将被销毁。这意味着这些资源在事务结束时无论如何都会被清理。

    在事务提交的情况下,需要关闭这些 LO fds,以避免在提交时出现关于资源泄露的警告。这是因为在提交时,系统会检查所有资源是否已经被正确管理,包括打开的文件描述符。

    在事务中止的情况下,可以跳过关闭 LO fds 的步骤。这是因为在中止事务时,系统会回滚所有更改,并且通常不需要执行与提交相同的清理操作。

第六、调用PreCommit_Notify函数处理事务提交前与NOTIFY命令相关的操作。

它确保了NOTIFY命令能够在事务提交时正确地通知其他会话或应用程序。

    /*
    * Insert notifications sent by NOTIFY commands into the queue.This
    * should be late in the pre-commit sequence to minimize time spent
    * holding the notify-insertion lock.However, this could result in
    * creating a snapshot,so we must do it before serializable cleanup.
    */
    PreCommit_Notify();

第七、判断当前是否为并行执行模式。

False,执行PreCommit_CheckForSerializationFailure 函数,在事务准备提交时,检查当前事务是否可能与其他事务发生了冲突。如果检测到冲突,函数会抛出一个错误,导致当前事务回滚。(这里主要发生在并发执行情况下或者多个表的复杂查询事务)
通过这种方式,PostgreSQL 确保事务的串行化执行,避免数据不一致的问题。

    /*
    * Mark serializable transaction as complete for predicate locking
    * purposes.This should be done as late as we can put it and still allow
    * errors to be raised for failure patterns found at commit.This is not
    * appropriate in a parallel worker however,because we aren't committing
    * the leader's transaction and its serializable state will live on.
    */
    if (!is_parallel_worker)
        PreCommit_CheckForSerializationFailure();
  1. 串行化是事务隔离级别中最高的级别,它确保事务的执行就像它们是串行执行的一样,避免了所有并发问题。
  2. 可序列化事务(Serializable Transaction):可序列化事务是数据库事务的最高隔离级别,它通过完全串行化事务的执行来避免所有类型的并发问题,如脏读、不可重复读和幻读。
  3. 谓词锁定(Predicate Locking):谓词锁定是一种数据库锁定技术,用于锁定满足特定条件的数据行,而不是锁定整个表或数据页。这允许更细粒度的并发控制。

第八、关闭中断机制,清理重置映射,正式开始提交事务清理资源。

    /* Prevent cancel/die interrupt while cleaning up */
    HOLD_INTERRUPTS();

    /* Commit updates to the relation map --- do this as late as possible */
    AtEOXact_RelationMap(true, is_parallel_worker);

2.4 提交处理:

第一、修改事务状态,开始事务提交。

    /*
    * set the current transaction state information appropriately during
    * commit processing
    */
    s->state = TRANS_COMMIT;
    s->parallelModeLevel = 0;

第二、根据并行事务状态,处理日志。

检查并行执行状态。不是并行事务,调用RecordTransactionCommit函数记录当前XID的日志。是并行事务,则调用ParallelWorkerReportLastRecEnd函数处理WAL日志,将当前XID置为InvalidTransactionId。

    if (!is_parallel_worker)
    {
        /*
        * We need to mark our XIDs as committed in pg_xact.This is where we
        * durably commit.
        */
        latestXid = RecordTransactionCommit();
    }
    else
    {
        /*
        * We must not mark our XID committed; the parallel leader is
        * responsible for that. */
        latestXid = InvalidTransactionId;
        /*
        * Make sure the leader will know about any WAL we wrote before it
        * commits. */
        ParallelWorkerReportLastRecEnd(XactLastRecEnd);
    }

ParallelWorkerReportLastRecEnd函数的目的是确保领导者进程在我们提交事务之前知道工作者进程已经写入的所有 WAL 日志。这是必要的,因为在并行事务处理中,领导者进程需要等待所有工作者进程完成它们的任务,并且记录了它们所有的更改,然后才能安全地提交整个事务。

第三、通知系统当前进程(MyProc)已经结束了一个事务。

ProcArrayEndTransaction 函数用于通知系统当前进程(MyProc)已经结束了一个事务,并且提供了要结束的事务 XID(latestXid)。ProcArrayEndTransaction 调用的顺序要求:

  1. 必须在释放当前进程持有的锁之前执行。这是因为在锁释放之前,其他进程需要知道当前进程已经结束了事务,以避免潜在的死锁或资源争用问题。
  2. 同时,它也必须在 RecordTransactionCommit 调用之后执行。RecordTransactionCommit 函数用于记录事务提交到 WAL(Write-Ahead Logging)日志,确保事务的持久性。
    ProcArrayEndTransaction(MyProc, latestXid);

ProcArrayEndTransaction函数标记了一个事务不在运行。从这一步以后,即便出错也来不及阻止事务提交了,后续都是资源的释放和参数重置过程。

2.5 释放资源:

第一、释放TopTransactionResourceOwner所拥有的资源。

  1. AtEOXact_Buffers函数清理缓冲区。
  2. AtEOXact_RelationCache函数清理关系缓存。
  3. AtEOXact_Inval函数在主事务结束时处理排队中的无效信息。
  4. AtEOXact_MultiXact函数结束多事务。
    ResourceOwnerRelease(TopTransactionResourceOwner,
                            RESOURCE_RELEASE_BEFORE_LOCKS,
                            true, true);
    /* Check we've released all buffer pins */
    AtEOXact_Buffers(true);
    /* Clean up the relation cache */
    AtEOXact_RelationCache(true);
    /*
    * Make catalog changes visible to all backends.This has to happen after
    * relcache references are dropped (see comments for
    * AtEOXact_RelationCache), but before locks are released (if anyone is
    * waiting for lock on a relation we've modified, we want them to know
    * about the catalog change before they start using the relation). 
    */
    AtEOXact_Inval(true);
    AtEOXact_MultiXact();
    ResourceOwnerRelease(TopTransactionResourceOwner,
                        RESOURCE_RELEASE_LOCKS,
                        true, true);
    ResourceOwnerRelease(TopTransactionResourceOwner,
                        RESOURCE_RELEASE_AFTER_LOCKS,
                        true, true);

ResourceOwnerRelease函数释放参数TopTransactionResourceOwner及其后代拥有的所有资源,但不删除“资源Owner”对象本身。

第二、处理删除操作并通知事务成功完成。

    smgrDoPendingDeletes(true);
    /*
    * Send out notification signals to other backends (and do other
    * post-commit NOTIFY cleanup).  This must not happen until after our
    * transaction is fully done from the viewpoint of other backends.
    */
    AtCommit_Notify();

第三、依次清理资源。

  1. AtEOXact_GUC(true, 1);
    处理:运行时配置参数(GUC)。
    作用:在事务结束时应用或撤销事务期间设置的配置更改。
  2. AtEOXact_SPI(true);
    处理:服务器过程接口(SPI)。
    作用:清理 SPI 在事务中使用的资源和状态。
  3. AtEOXact_Enum();
    处理:枚举类型。
    作用:管理枚举类型的元数据,确保事务结束后枚举状态是一致的。
  4. AtEOXact_on_commit_actions(true);
    处理:提交时执行的动作。
    作用:执行在事务提交时需要进行的特定动作或回调。
  5. AtEOXact_Namespace(true, is_parallel_worker);
    处理:命名空间。
    作用:清理命名空间相关的资源,可能与并行工作有关。
  6. AtEOXact_SMgr();
    处理:存储管理器。
    作用:管理文件和存储相关的资源,如释放锁或处理文件删除。
  7. AtEOXact_Files(true);
    处理:文件资源。
    作用:清理事务中使用的文件,如临时文件。
  8. AtEOXact_ComboCid();
    处理:组合命令 ID。
    作用:管理与组合命令 ID 相关的事务状态。
  9. AtEOXact_HashTables(true);
    处理:哈希表。
    作用:清理或刷新哈希表,确保数据结构的一致性。
  10. AtEOXact_PgStat(true, is_parallel_worker);
    处理:pg_stat 统计信息。
    作用:更新统计收集模块的状态,可能与并行工作有关。
  11. AtEOXact_Snapshot(true, false);
    处理:事务快照。
    作用:清理事务快照,确保 MVCC 状态下的数据可见性正确。
  12. AtEOXact_ApplyLauncher(true);
    处理:逻辑复制应用启动器。
    作用:管理逻辑复制相关的事务结束时的资源和状态。
  13. pgstat_report_xact_timestamp(0);
    处理:事务时间戳统计。
    作用:报告事务的时间戳信息给 pg_stat 模块,0 可能表示当前时间或其他特定值。
    /*
    * Everything after this should be purely internal-to-this-backend
    * cleanup.
    */
    AtEOXact_GUC(true, 1);
    AtEOXact_SPI(true);
    AtEOXact_Enum();
    AtEOXact_on_commit_actions(true);
    AtEOXact_Namespace(true, is_parallel_worker);
    AtEOXact_SMgr();
    AtEOXact_Files(true);
    AtEOXact_ComboCid();
    AtEOXact_HashTables(true);
    AtEOXact_PgStat(true, is_parallel_worker);
    AtEOXact_Snapshot(true, false);
    AtEOXact_ApplyLauncher(true);
    pgstat_report_xact_timestamp(0);

第四、重置全局变量和状态变量。

重置CurrentResourceOwner、XactTopFullTransactionId、CurTransactionResourceOwner、TopTransactionResourceOwner、nParallelCurrentXids和事务状态变量TransactionState s。ResourceOwnerDelete函数会删除TopTransactionResourceOwner参数的对象及其后代。

    CurrentResourceOwner = NULL;
    ResourceOwnerDelete(TopTransactionResourceOwner);
    s->curTransactionOwner = NULL;
    CurTransactionResourceOwner = NULL;
    TopTransactionResourceOwner = NULL;
    AtCommit_Memory();
    s->fullTransactionId = InvalidFullTransactionId;
    s->subTransactionId = InvalidSubTransactionId;
    s->nestingLevel = 0;
    s->gucNestLevel = 0;
    s->childXids = NULL;
    s->nChildXids = 0;
    s->maxChildXids = 0;
    XactTopFullTransactionId = InvalidFullTransactionId;
    nParallelCurrentXids = 0;

2.6 提交事务:

修改事务状态为TRANS_DEFAULT,放开中断机制,完成事务提交。

    s->state = TRANS_DEFAULT;
    RESUME_INTERRUPTS();

作者介绍

李超,移动云数据库工程师,负责云原生数据库He3DB的研发。

【AUTOSAR SystemServices】AUTOSAR CP中Watchdog Manager模块技术解析 本文深入解析了AUTOSAR中的Watchdog Manager模块实现。该模块通过多层次监督机制(Alive/Deadline/Logical Supervision)确保系统安全运行,具备动态模式切换和分级故障处理能力。 关键实现包括: 数据结构设计:包含监督实体状态结构体(实时状态维护)、监督配置结构体(支持模式切换)和全局状态信息(系统级监控) 核心流程优化:初始化采用事务性设计,检查点处理通过条件编译优化,主监控循环采用流水线式并行处理 监督机制实现:Alive监督采用滑动窗口算法,Deadlin 阅读详情

相关推荐

Windows非分页缓冲池内存泄漏实战:PoolMon与RAMMap高效排查指南

本文详细介绍了Windows系统中非分页缓冲池内存泄漏的实战排查方法。当系统出现卡顿且内存占用异常增长时,通过RAMMap工具快速定位非分页缓冲池异常,并利用PoolMon监控内核内存分配标签,精准锁定泄漏源。文章提供了从确认症状、安装工具到使用findstr命令溯源驱动文件的完整五步排查流程,并总结了常见泄漏标签与解决方案,帮助用户高效解决深层系统内存问题。

weixin_28455801的博客 1008

海山数据库(He3DB)源码详解:事务源码执行过程

本文介绍了He3DB数据库在DDL和DML操作过程中,两种事务在底层源码执行流程细节。

He3DB_ht的博客 483

MDM主数据清洗和编码集成说明

绝大多数的企业业务系统是伴随业务发展而建设的,但随着业务发展单一系统难以支撑企业业务闭环。MDM主数据管理平台可以满足企业数据治理的需求,本文针对主数据清洗和编码集成进行梳理。...

数通畅联 3318

Spring Boot 数据源与 MyBatis(-Plus) 自定义配置详解

本文详解 Spring Boot 中单数据源环境下 HikariCP 与 MyBatis-Plus 的自定义配置。通过手动声明 SqlSessionFactory,实现下划线转驼峰、日志输出、一级缓存策略等精细化控制。结合 HikariCP 核心参数调优(如最大连接数、连接生命周期),确保高性能与稳定性。适用于仅需访问单一数据库的场景,避免多数据源复杂性,兼顾性能与可维护性。

BADAO_LIUMANG_QIZHI的博客 195

AutoCAD矢量数据导出全攻略:GIS4CAD插件一键转shp/mdb/kml(附安装包)

本文详细介绍了GIS4CAD插件如何高效解决AutoCAD矢量数据向GIS格式转换的难题。通过一键操作,用户可将CAD中的规划图、地形图等无损转换为行业标准的shp、mdb、kml等多种格式,并确保属性完整与坐标准确。文章提供了从插件安装、数据准备到实战导出的全流程指南,是城市规划、测绘等领域专业人士提升数据互操作效率的必备攻略。

a2b3c4d5e的博客 283

SAP-ABAP:SAP中如何查看系统表之间的关联关系?

在业务逻辑开发或者ALV开发过程中,我们通常要从系统中找出几个标准表之间的关联关系,有的是head与item,通过外键进行关联的关系。那么怎么去找到呢?以上就是具体如何产看系统表之间的关联关系的步骤,对于不同代码的业务顾问,也是必须要掌握的。

LinkStar的博客 2430

在Codex 让AI模型 拥有长期智能记忆

本文介绍Claude-Mem V15新功能——智能记忆召回,解决AI遗忘、重复提示、执行不一致等问题。通过本地部署claude-mem,实现自动记录决策(如数据库选型)、跨会话智能召回,支持记忆写入、检索、遗忘全流程闭环。相比传统记忆方案,其基于Hooks自动捕获工具调用,结构化存储,可追溯、可共享、可清理,显著提升工程效率与协作一致性,是长期项目中理想的“工作黑匣子”与“工程脑”。

米莱虾 265

Linux(31)Rockchip RK3568 Ubuntu22.04上部署 Docker: 问题与解决方案

本博客在总结这些问题及其解决方案,为遇到类似问题的兄弟提供参考,如果我后续有碰到其他Docker 问题也会在此更新补充。

我其实什么都不会 1645

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 117

⭐️VMwareWorkstation17.0虚拟机搭建WindowsXP虚拟机(完整安装步骤详细图文教程)

Windows XP是微软公司研发的计算机操作系统,于2001年10月25日正式发布。其名字中“XP”的意思来自英文中的“体验”(Experience)。Windows XP使用了Luna图形用户界面和双列开始菜单,提升了系统的安全性和工作性能,提供了WiFi支持,简化了软件的安装和运行,并增加了远程桌面功能。

Python老吕的博客 1万+

【OpenClaw从入门到精通】第63篇:A股智能分析实战——用OpenClaw搭建个人量化研究助手(2026实测版)

2026年,OpenClaw已成为量化投研圈的现象级工具,八家头部券商密集发布专题研报力证其价值。传统量化投研面临技术门槛高、重复劳动多、策略迭代慢、非结构化数据处理弱四大痛点,而OpenClaw通过“AI智能体+金融Skill+量化API”的融合,实现了从数据获取、策略生成、回测验证到持仓监控的全流程自动化。本文基于2026年最新实测经验,完整呈现个人量化研究助手搭建:从阿里云部署、阿里云百炼API配置(含解析失败解决方案)、Tushare数据源接入,到PB-ROE价值选股、研报复现、自动化回测、持仓监控

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1058

Docker Compose:搭建本地多服务开发环境

从一个 Java API、PostgreSQL 和 Redis 开始,配置服务名、端口、环境变量、健康检查、数据卷和依赖关系。理解 Compose 文件如何被解析、项目如何隔离,以及哪些数据不能依赖“重建容器”保留,能够把个人开发环境整理成团队可复用的启动入口。

m0_62221377的博客 428

Java Swing教程-16. Swing中的图形绘制

这篇教程介绍了Java Swing中的图形绘制功能,主要内容包括: Graphics类的基本使用 - 介绍了如何重写paintComponent方法实现自定义绘制,以及基本图形绘制方法(线条、矩形、椭圆、多边形等) 文本与图片绘制 - 讲解了文本绘制方法、字体设置和图片加载绘制技术 颜色与字体设置 - 包括预定义颜色、RGB自定义颜色、透明色设置以及字体样式控制 案例实现 - 提供了一个简单绘图程序的框架,支持鼠标绘制不同图形、选择工具和自定义颜色等功能 教程通过代码示例详细演示了各种绘图操作,适合Java

无 233

45-存储过程与函数

匿名块跑完就没了,想下次再用只能复制粘贴。给块起个名字存进数据库,就成了存储过程与函数:一次编译、处处调用、权限收口,还能让 Java 侧少拼 SQL。这篇讲封装、调用、限制与排错的完整套路。CREATE OR REPLACE 覆盖式创建,事务由调用方控制;参数三模式 IN 只进、OUT 只出、IN OUT 双向,OUT 参数调用时要备好变量接;调用三姿势 EXEC、CALL、匿名块,命名传参=>最清晰;函数必有 RETURN,想在 SQL 里调用就不能碰 DML 和事务控制;

yuhou25的博客 152

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

AI全栈实战 | 3.9-01 爬虫入门:requests 加 BeautifulSoup 三分钟跑通,但 90% 的人栽在这 4 个“礼貌“问题上

⚠️:本文内容仅用于。请遵守目标站点的服务条款与相关法律法规,不得对目标服务造成负担,不得采集、传播个人隐私数据。技术是中性的,边界在你手里。爬虫的入门技术(requests 发请求 + BeautifulSoup 解析)三分钟就能学会。真正区分"会用爬虫"和"会做爬虫的人"的,是这篇我们跑通"请求→解析→存储"的最小闭环,然后重点把"合规与礼貌"这根弦给你绷上。

源码获取 | 运行部署 | 定制二开修改,如果回复不及时请耐心等待,请见谅。 392

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

数据库乐观锁深度解析:MySQL、PostgreSQL 实战 + Spring Boot 集成指南

Oracle 提供了ORA_ROWSCN伪列(System Change Number),记录最后修改行的 SCN,类似 PostgreSQL 的xmin。实践中通常仍使用 version 字段方案,逻辑与 MySQL 完全相同。-- Oracle:通过 ORA_ROWSCN 实现乐观锁-- 更新时比对 SCN// 自定义注解// AOP 切面@Aspect@Component@Slf4jtry {

yjc_1111的专栏 399

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

数据库主键选型指南:BIGINT vs VARCHAR

主键选型关乎数据库性能与架构演进。BIGINT(如雪花算法)在顺序写入、二级索引开销和分布式生成上优势显著,适合高并发核心链路;而传统 VARCHAR UUIDv4 因随机性导致频繁页分裂、存储膨胀,性能堪忧。UUIDv7 通过时间戳有序性实现高效追加写入,结合 BINARY(16) 存储可兼顾性能与安全,成为现代微服务新选择。关键在于:主键应稳定、无业务含义,优先选用趋势递增的紧凑类型,并根据场景合理采用双主键模式或 ULID 等替代方案。

小李同学的博客 300

自动化运维选型:四条技术路线的能力边界,以及它们为什么不能互相替代

自动化运维怎么选型?拆解配置管理、基础设施即代码、作业调度与场景化编排四条技术路线边界,分析账本归属与时间语义差异,给出四种架构组合与判断点,帮企业看清为何不能互相替代。

trainsignalcn的专栏 324

不用再为文本搜索单独维护一套系统!全文检索深度解析

为了给商品、客服工单或者企业知识库增加一个搜索框,企业往往需要在业务数据库之外,再部署一套Elasticsearch。数据库保存商品、订单和用户等真实业务数据,搜索引擎保存另一份文本索引;两套系统之间,还需要通过CDC、消息队列或者同步程序持续传输数据。一个看似简单的搜索需求,最后可能变成两套集群、两份数据和一条必须保持稳定的数据链路。由此产生的问题并不少:数据库已经完成更新,搜索结果却可能尚未同步;业务查询同时涉及文本、库存、权限和订单状态时,应用需要在两个系统之间来回组合结果;

TiDB 社区干货传送门 207

48-逻辑结构表空间段区块

默认 10%,意思是块里的空闲空间低于 10% 时就不再插入新行,留着给已有行的 UPDATE 变胖用。注意 INSERT 过程中每次申请新区,都是一次潜在的空间报错点,如果表空间满了,此刻就会抛 ORA-01653。剩下的空间被谁占了?段的每个区可以落在表空间的任一数据文件,所以 2T 的表在 32G 单文件上限(smallfile)的世界里照样能活——多加文件就行。,一张只有两个 CLOB 字段的表,实际在库里是三个段(表段 + 两个 LOBSEGMENT),空间统计漏算 LOB 段是新手常犯的错。

yuhou25的博客 284
上一篇: 海山数据库(He3DB)源码详解:StartTransaction函数
下一篇: 海山数据库(He3DB)源码详解:AbortTransaction函数
DAWN1221
博客等级 码龄7年 893粉丝 95原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值