当前位置: 首页 > article >正文

GBase 8c 在过程里记流水时要小心自治事务边界

GBase 8c 在过程里记流水时要小心自治事务边界我最近看 GBase 8c 自治事务资料时觉得它特别适合拿来讨论一个开发现场经常遇到的问题业务过程失败了排障流水也跟着回滚了。等真正去查问题时只剩应用日志里几行模糊报错数据库侧看不到入参、关键状态、校验失败原因。尤其是批处理、清结算、接口落库这类场景失败链路的现场信息往往比成功数据更重要。GBase 8c 支持在函数中定义自治事务标识符为PRAGMA AUTONOMOUS_TRANSACTION。我自己的理解是它能让某段过程内的记录动作拥有独立提交边界不随外层事务一起回滚。这个能力很好用但也很容易被滥用。真正落到现场时它更适合记录审计流水、错误明细、处理轨迹不适合作为绕开事务一致性的业务捷径。为什么普通流水会被回滚带走先看一个常见写法。业务过程里先写处理日志再做业务更新最后发现校验失败抛异常CREATETABLEops_proc_log(log_idbigint,biz_idvarchar(64),step_namevarchar(64),log_msgvarchar(500),create_timetimestamp);CREATETABLEpay_order(order_idvarchar(64),order_statusvarchar(20),pay_amtnumeric(18,2),update_timetimestamp);伪过程逻辑如下INSERTINTOops_proc_logVALUES(10001,PAY202605150001,CHECK,start check,current_timestamp);UPDATEpay_orderSETorder_statusPAID,update_timecurrent_timestampWHEREorder_idPAY202605150001;-- 后面发现对账金额不一致抛出异常外层事务回滚如果日志表和业务表处在同一个事务里业务更新回滚的同时前面写入的ops_proc_log也会回滚。业务数据保持一致是对的但排障线索消失了。这时自治事务就有价值。它让“记录现场”这件事从外层业务事务里拆出来失败也能留下独立提交的日志。自治事务适合放在哪里自治事务最容易被误用的地方是把业务补偿、状态推进、库存扣减也写进去。我的习惯是把它限定在“非主业务事实”的记录类对象上。用法是否建议原因记录过程入参建议便于失败后还原现场记录校验失败原因建议外层事务回滚后仍可排查记录批次处理进度视场景要区分进度日志和业务状态更新订单状态不建议容易破坏业务事务一致性扣减账户余额不建议失败后可能形成脏业务事实写审计流水建议审计记录通常要求独立留存从落地角度看我更愿意把自治事务写成一个很小的日志函数外层过程只调用它不在里面塞复杂业务逻辑。一个更安全的日志函数形态示例可以设计成这样CREATETABLEops_autonomous_log(log_idbigint,module_namevarchar(64),biz_keyvarchar(128),step_namevarchar(64),log_levelvarchar(16),log_messagevarchar(1000),create_timetimestamp);自治事务函数只做一件事插入日志并提交。CREATEORREPLACEFUNCTIONwrite_proc_log(p_log_idbigint,p_module_namevarchar,p_biz_keyvarchar,p_step_namevarchar,p_log_levelvarchar,p_log_messagevarchar)RETURNvoidASDECLAREPRAGMA AUTONOMOUS_TRANSACTION;BEGININSERTINTOops_autonomous_log(log_id,module_name,biz_key,step_name,log_level,log_message,create_time)VALUES(p_log_id,p_module_name,p_biz_key,p_step_name,p_log_level,p_log_message,current_timestamp);COMMIT;END;/现场实现时函数语法要结合数据库兼容模式、过程语言规范和项目开发标准确认。这里的重点不是语法花样而是边界自治函数只写日志不读取复杂业务表不修改主数据。外层过程调用示例SELECTwrite_proc_log(20001,PAY_CLEAR,BATCH2026051501,START,INFO,clear batch start);SELECTwrite_proc_log(20002,PAY_CLEAR,BATCH2026051501,CHECK_BALANCE,ERROR,balance check failed, diff amount over threshold);自治事务不是“失败也要提交业务”的工具这个边界要特别强调。自治事务提交后不会因为外层事务失败而自动回滚。如果把它用在业务表上就可能出现外层失败、局部业务数据已提交的情况。外层事务结果自治日志结果是否符合预期外层提交日志提交正常外层回滚日志提交适合排障外层回滚业务状态被自治提交高风险外层重试多条日志被记录可接受但要设计幂等标识我更倾向于给自治事务相关对象加命名规范比如ops_、audit_、trace_开头避免开发把业务表误放进去。代码评审时只要看到PRAGMA AUTONOMOUS_TRANSACTION就要追问它写的是不是主业务事实记录失败日志还要考虑幂等和噪声自治事务让日志能留下来但并不意味着日志可以随便写。批处理失败重试、接口超时重发、应用自动补偿都会带来重复日志。没有幂等设计排障时日志会变成噪声。我常用这几个字段字段用途module_name区分业务模块biz_key关联业务主键或批次号step_name定位处理阶段log_level区分 INFO/WARN/ERRORrequest_id对接应用链路追踪retry_no标识第几次重试create_time还原时间线示例扩展ALTERTABLEops_autonomous_logADDrequest_idvarchar(128);ALTERTABLEops_autonomous_logADDretry_nointeger;ALTERTABLEops_autonomous_logADDhost_namevarchar(128);排查时可以这样看SELECTbiz_key,step_name,log_level,log_message,create_timeFROMops_autonomous_logWHEREmodule_namePAY_CLEARANDbiz_keyBATCH2026051501ORDERBYcreate_time;如果错误日志量很大还要给运维留清理策略。自治事务日志不是审计日志的完整替代品也不能无限增长。高频批处理建议按日期或批次归档。异常处理里调用自治日志更实用自治事务最适合放在异常处理路径里。外层事务失败时异常信息、关键入参、影响范围都能留下。BEGINSELECTwrite_proc_log(30001,ORDER_SYNC,REQ202605150001,START,INFO,sync start);UPDATEpay_orderSETorder_statusSYNCEDWHEREorder_idPAY202605150001;EXCEPTIONWHENOTHERSTHENSELECTwrite_proc_log(30002,ORDER_SYNC,REQ202605150001,EXCEPTION,ERROR,sync failed);RAISE;END;我会避免在异常里做大查询、大对象拼接、复杂循环。异常路径本身就处在不稳定状态自治日志函数要足够轻量失败也不要拖垮主流程。权限和安全也要单独设计自治事务函数通常会被很多业务过程调用。如果权限放得太宽可能被拿来写入伪造日志如果权限太窄又可能导致异常时日志写不进去。项目建议日志表写权限只授予日志函数所属用户业务用户只授予执行日志函数权限日志内容避免写敏感明文如密码、证件完整号清理权限由运维或审计角色控制查询权限按模块或角色拆分示例GRANTEXECUTEONFUNCTIONwrite_proc_logTOapp_pay_user;REVOKEINSERT,UPDATE,DELETEONops_autonomous_logFROMapp_pay_user;我更倾向于让业务账号“只能调用函数不能直接改日志表”。这样既保留使用便利也减少日志被篡改的风险。落地前我会做这几项检查检查项重点是否只写日志类对象防止业务事实绕开外层事务是否有批次号或请求号便于串起链路是否考虑重试重复避免日志误判是否控制日志大小防止高频错误打满空间是否有清理归档策略运维可持续是否有权限隔离防止伪造和篡改是否在测试库验证回滚行为确认外层回滚后日志仍在自治事务是一个很有用的工具但它适合小心使用。我的理解是它不是用来“突破事务”的而是用来在事务失败时保留排障和审计线索。只要边界画清楚很多生产问题的定位成本会明显下降。参考资料自治事务 | GBASE南大通用 https://www.gbase.cn/docs/gbase-8c/03%20%E5%BC%80%E5%8F%91%E8%80%85%E6%8C%87%E5%8D%97/%E8%87%AA%E6%B2%BB%E4%BA%8B%E5%8A%A1 GBase 8c数据库使用 | GBASE南大通用 https://www.gbase.cn/docs/gbase-8c/03%20%E5%BC%80%E5%8F%91%E8%80%85%E6%8C%87%E5%8D%97/%E6%95%B0%E6%8D%AE%E5%BA%93%E4%BD%BF%E7%94%A8 南大通用GBase 8c企业级数据库特性之兼容性 https://www.gbase.cn/community/post/4794

相关文章:

GBase 8c 在过程里记流水时要小心自治事务边界

GBase 8c 在过程里记流水时要小心自治事务边界 我最近看 GBase 8c 自治事务资料时,觉得它特别适合拿来讨论一个开发现场经常遇到的问题:业务过程失败了,排障流水也跟着回滚了。等真正去查问题时,只剩应用日志里几行模糊报错&#…...

碧蓝航线Alas自动化脚本:10分钟解放双手的智能游戏助手

碧蓝航线Alas自动化脚本:10分钟解放双手的智能游戏助手 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研,全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript 还在为每…...

地理学者必抢的AI协同时代入场券:NotebookLM+QGIS工作流搭建指南(仅限首批内测用户验证版)

更多请点击: https://intelliparadigm.com 第一章:NotebookLM地理学研究辅助的范式革命 从静态文献到动态知识图谱 NotebookLM 通过语义切片与向量对齐技术,将地理学经典文献(如《人文地理学导论》《自然地理学原理》&#xff…...

对比直接购买与使用Taotoken Token Plan套餐的成本控制体验

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 对比直接购买与使用Taotoken Token Plan套餐的成本控制体验 1. 引言:个人开发者的成本困惑 作为个人开发者&#xff0…...

Kleiber:简化多架构Docker镜像构建与发布的自动化工具

1. 项目概述与核心价值最近在整理自己的开发工具链时,又翻出了devgap/kleiber这个项目,它在我日常的容器化开发工作流中扮演了一个相当关键但又不那么起眼的角色。简单来说,Kleiber 是一个 Docker 镜像的构建和发布自动化工具,但它…...

谷歌搜索量在哪里查询?新手3分钟掌握的查词流程

外贸独立站日均访问量停留在个位数。文章更新了100多篇,带来真实询盘的网页往往只有两三个。把大量工作时间花在无人问津的短语上,写出来的几千字长文如同扔进海里的石头。谷歌每天处理全世界超过85亿次查询请求。你打算把一批1000个不锈钢保温杯卖到海外…...

【NotebookLM政治学研究加速器】:20年政治理论研究员亲授5大高阶用法,告别文献综述低效时代

更多请点击: https://intelliparadigm.com 第一章:NotebookLM政治学研究辅助的范式革命 传统政治学研究长期依赖人工文献综述、手工编码与静态模型推演,面临信息过载、理论验证滞后与跨文本语义关联薄弱等结构性瓶颈。NotebookLM 作为基于引…...

ElevenLabs多角色对话生成性能压测报告:单实例并发超86路时语音错位率飙升至41.7%,我们找到了唯一稳定解

更多请点击: https://intelliparadigm.com 第一章:ElevenLabs多角色对话生成性能压测报告:单实例并发超86路时语音错位率飙升至41.7%,我们找到了唯一稳定解 在真实业务场景中,ElevenLabs API 被广泛用于构建多角色交互…...

图解ConvTranspose1d:从计算图到代码实现的逆向思维

1. 从Conv1d到ConvTranspose1d的思维转换 第一次接触ConvTranspose1d时,我和大多数人一样困惑:为什么要把好好的卷积操作反过来计算?直到在语音合成项目中被迫深入使用后,才明白这种"逆向思维"的价值。想象你正在玩拼图…...

PlayAI多语种同步翻译实测报告:98.7%端到端准确率、<320ms平均延迟,如何在12种语言间零感知切换?

更多请点击: https://intelliparadigm.com 第一章:PlayAI多语种同步翻译功能详解 PlayAI 的多语种同步翻译功能基于端到端神经机器翻译(NMT)架构与实时语音流处理引擎深度融合,支持中、英、日、韩、法、西、德、俄等 …...

控制理论实践:从PID到MPC的Python实现与仿真调试

1. 项目概述:从“Gonzo”看控制理论在开源项目中的实践最近在GitHub上看到一个挺有意思的项目,名字叫“control-theory/gonzo”。光看这个标题,你可能会有点摸不着头脑——“控制理论”和“Gonzo”有什么关系?Gonzo这个词&#xf…...

MySQL实现跨库在线迁移的方法_利用Binlog实时数据同步工具

MySQL跨库迁移不能只靠mysqldump,因其逻辑全量导出会锁表或阻塞写入,且无位点信息无法增量追平;必须结合binlog实时拉取回放实现秒级停机。MySQL跨库迁移为什么不能只靠mysqldump因为mysqldump是逻辑全量导出,锁表或至少阻塞写入&…...

别再被VS2019的CMake报错劝退!从‘RC命令失败’看Windows C++开发环境那些坑

破解Windows C开发环境迷局:从CMake报错到系统级解决方案 当你在Visual Studio 2019中满怀期待地点击"生成解决方案",却看到控制台突然弹出"RC命令失败"的红色错误时,那种挫败感每个C开发者都深有体会。这不仅仅是一个简…...

3步解放暗黑2存档:Diablo Edit2角色编辑器完全指南

3步解放暗黑2存档:Diablo Edit2角色编辑器完全指南 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit 你是否曾因暗黑破坏神2角色build失误而懊恼?是否厌倦了数百小时刷装备却…...

Go语言实现轻量级双向文件同步工具clawsync配置与实战

1. 项目概述:一个轻量级的文件同步利器在数据备份、多设备协同或者项目部署的场景里,文件同步是个绕不开的活儿。你可能用过rsync,功能强大但命令参数复杂;也可能试过syncthing,全平台覆盖但需要常驻后台服务。如果你在…...

从源码到应用:VTK编译与配置全流程实战

1. VTK简介与环境准备 VTK(Visualization Toolkit)是一款强大的开源三维可视化库,广泛应用于医学影像、科学计算、工程仿真等领域。我第一次接触VTK是在开发一个医学图像处理项目时,当时被它丰富的渲染功能和跨平台特性所吸引。对…...

开源创富的三大支柱:技术、流量与商业化的完美结合

开源创富的三大支柱:技术、流量与商业化的完美结合 关键词:开源项目、技术壁垒、流量运营、商业化闭环、社区生态、价值变现、开源经济学 摘要:很多人对“开源”的理解停留在“免费送代码”,但实际上,开源是一套用技术…...

COMSOL声学建模实战:从无源特征频率到有源辐射边界

1. COMSOL声学建模基础:从理论到实践 声学建模在工程领域应用广泛,无论是建筑声学设计、噪声控制还是音频设备开发,都需要对声波传播特性有深入理解。COMSOL Multiphysics作为一款强大的多物理场仿真软件,提供了完整的声学建模解决…...

【附C源码】循环队列的C语言实现

【附C源码】循环队列的C语言实现 队列作为基础数据结构之一,在操作系统调度、消息传递、广度优先搜索等场景中均有广泛应用。本文将探讨一种基于循环数组的队列实现方案,该方案在内存利用率和操作效率之间取得了较好的平衡。 设计思路 传统数组实现队列时…...

Void-Memory:内存与持久化的平衡术,构建高性能本地缓存与状态存储

1. 项目概述与核心价值最近在折腾一个挺有意思的开源项目,叫G3sparky/void-memory。乍一看这个标题,可能会让人有点摸不着头脑——“虚空记忆”?这听起来更像是一个哲学概念或者游戏里的技能名。但作为一个在技术圈摸爬滚打多年的老手&#x…...

用TensorFlow 2.0复现Mask R-CNN:从ResNet主干到ROI Align的保姆级代码解读

TensorFlow 2.0实现Mask R-CNN核心技术解析:从ResNet到ROI Align的工程实践 在计算机视觉领域,实例分割一直是最具挑战性的任务之一。它不仅需要精确地定位物体,还要在像素级别上区分不同实例。本文将深入探讨如何用TensorFlow 2.0实现Mask R…...

Windows下用Python调用CDS API下载ERA5数据,报错Missing/incomplete configuration?手把手教你创建.cdsapirc配置文件

Windows下Python调用CDS API下载ERA5数据报错排查指南:从配置文件创建到隐藏文件陷阱全解析 当你在Windows系统上首次尝试使用Python调用CDS API下载ERA5气象数据时,可能会遇到一个令人困惑的报错:"Missing/incomplete configuration f…...

LizzieYzy围棋AI分析平台:从棋谱复盘到AI教练的完整指南

LizzieYzy围棋AI分析平台:从棋谱复盘到AI教练的完整指南 【免费下载链接】lizzieyzy LizzieYzy - GUI for Game of Go 项目地址: https://gitcode.com/gh_mirrors/li/lizzieyzy 围棋作为世界上最复杂的棋类游戏之一,其学习曲线一直被认为是陡峭而…...

京东自动抢购工具完整指南:5分钟学会Python自动化购物

京东自动抢购工具完整指南:5分钟学会Python自动化购物 【免费下载链接】autobuy-jd 使用python语言的京东平台抢购脚本 项目地址: https://gitcode.com/gh_mirrors/au/autobuy-jd 还在为京东秒杀抢不到心仪商品而烦恼吗?想要在促销活动中轻松抢购…...

面向对象_昂瑞微_作者观点仅供参考

C 语言面向对象编程实例解析 选自 OnMicro OM6626 BLE SDK 中的 DFU(Device Firmware Upgrade)模块。 适合有一定 C 基础、想理解"如何在 C 中实现面向对象"的初级工程师。 一、先看最终效果:调用方完全不关心底层实现 在 onmicro…...

Spread.NET 10-19.1 都可以提供

关于 Spread.NET提供类似 Excel 的电子表格体验。Spread.NET 可帮助您创建电子表格、网格、仪表板和窗体。它包含一个强大的计算引擎,提供 450 多个函数,并支持导入和导出 Excel 电子表格。利用丰富的 .NET 电子表格 API 和强大的计算引擎,您…...

AI智能体记忆系统构建指南:从向量检索到混合搜索的工程实践

1. 项目概述:构建一个能“记住”的智能体最近在折腾AI智能体(Agent)开发的朋友,估计都遇到过同一个头疼的问题:这玩意儿怎么跟金鱼似的,聊两句就忘?你让它帮你整理一份周报,它吭哧吭…...

ToyKind-World:基于Python的ECS架构多智能体模拟框架构建指南

1. 项目概述与核心价值最近在GitHub上看到一个挺有意思的项目,叫“ToyKind-World”。光看这个名字,你可能会觉得有点抽象,是玩具世界?还是某种模拟器?点进去一看,发现它其实是一个用Python构建的、高度可配…...

终极指南:如何让微信网页版在浏览器中重新可用

终极指南:如何让微信网页版在浏览器中重新可用 【免费下载链接】wechat-need-web 让微信网页版可用 / Allow the use of WeChat via webpage access 项目地址: https://gitcode.com/gh_mirrors/we/wechat-need-web 还在为微信网页版无法正常访问而烦恼吗&…...

基于Dify平台快速构建AI对话机器人:从部署到生产级实践

1. 项目概述与核心价值最近在折腾AI应用落地的过程中,我反复被一个问题困扰:如何把一个强大的大语言模型(LLM)能力,快速、低成本地封装成一个能实际解决业务问题的对话机器人?自己从零开始搭框架、写API、处…...