062、事务与提交(COMMIT/ROLLBACK)

发布时间:2026/10/15 6:36:04

062、事务与提交(COMMIT/ROLLBACK) 062、事务与提交COMMIT/ROLLBACK——以为数据存上了其实早就灰飞烟灭有一次在生产机排查问题一个报表程序跑完日志里明明写着“更新成功”可SE16一看目标表里连根毛都没多。翻代码前面的UPDATE、MODIFY写得有模有样可全程找不到一个COMMIT WORK。程序正常结束没有报错数据却像被风吹走了一样。后来在调试模式里手动加了个COMMIT再一跑数据稳稳落库。那一刻我意识到ABAP里的事务提交不是你想不提交就不提交而是你没提交系统就当你是“闹着玩”。数据库修改不是即时的很多零基础的同学会以为在ABAP里执行了MODIFY zdemo FROM ls_data数据就已经写进表里了。错。那只是告诉数据库“我想改”但还没“画押”。当前会话里你自己用SELECT再读能看到这个修改因为DB连接还持有这个未提交的事务。可换个会话、换个用户或者SE16重新打开就看不到。只有当COMMIT WORK发出数据库才真正把这个事务画押落盘。要是你不画押程序一结束系统自动按“撤销”处理你改的东西全成了泡影。这就是ABAP里的逻辑工作单元LUW。一个事务要嘛全部生效要嘛全部归零没有中间地带。就像转钱A账户扣了B账户没加这是在耍流氓。事务就是让这两个动作要么都成要么都废。COMMIT WORK画押最简单的场景你在程序里做了一堆新增DATA: ls_customer TYPE zcustomer. ls_customer-id 1001. ls_customer-name 张三. MODIFY zcustomer FROM ls_customer.程序跑到这里数据还在空中飘。你需要在程序结尾或者你确认这些修改要保留的地方写一句COMMIT WORK.这句话一下数据库才“啪”一声盖章行数据才算你的。别嫌我啰嗦这个坑我见过太多人踩。写的时候记着后面忘了COMMIT一调试就是半天。后来我养成习惯凡是写数据库更新先在代码里标个“COMMIT在这里”跟交警贴罚单似的。ROLLBACK WORK反悔有提交就有回滚。ROLLBACK WORK把当前事务中所有未提交的修改全部撤掉就像你刚才什么都没干。MODIFY zcustomer FROM ls_customer. IF sy-subrc 0. ROLLBACK WORK. ENDIF.实际场景更多是先做了几个修改后面处理时发现逻辑错误或者某个关键字段有问题那就直接回滚。注意回滚不是必须的程序异常终止时系统也会自动回滚。但显式写出来逻辑清晰看代码的人一眼就知道这是“有条件的反悔”不然别人还得猜你想干嘛。别小看这个COMMIT它还会触发更新任务ABAP里有个东西叫“更新任务”写法是CALL FUNCTION Z_FOO IN UPDATE TASK.这个函数里面的数据库更新不会马上执行而是挂在当前事务的延时队列里。什么时候执行就是到了COMMIT WORK的时候。你的程序里要是攒了一堆更新任务COMMIT一放全部开始干活。如果你写了ROLLBACK那这些任务也跟着烟消云散。所以你调用别人写的函数时别以为函数里面有个MODIFY、UPDATE就代表数据已经改了。得看它是普通的数据库操作还是IN UPDATE TASK。如果是后者你外面不COMMIT等于白调。这在调试很多BAPI时特别明显比如过账函数返回了一堆成功消息却啥都没有因为在BAPI的文档里就写了调用完要自己去COMMIT。COMMIT WORK AND WAIT别抢跑有时候COMMIT WORK之后你后面的代码马上要去SELECT这些刚改的数据希望读到最新值。按理说COMMIT之后数据库已经提交应该能读到。但如果你用的是更新任务IN UPDATE TASK那些函数是异步执行的——COMMIT只发了个“启动”信号不会等它们跑完。后面代码紧接着去读可能读到的还是旧数据。这种情况要用COMMIT WORK AND WAIT。COMMIT WORK AND WAIT.它会等所有更新任务执行完毕再继续。用之前想清楚不必要的等待会拖慢性能。但如果有后续逻辑强依赖更新结果别省这个WAIT。循环里COMMIT你是在找死有个经典错误在SELECT循环里一边读一边UPDATE每更新一条就COMMIT一次。看起来“保证每一条都一定能保存”实际上会导致打开游标失效程序直接崩溃或者性能差到让人想砸电脑。数据库游标在事务提交后可能是会失效的尤其Oracle或HANA上很容易报“CURSOR_INVALID”之类的错。更稳妥的做法是先把要更新的数据收集到内表循环结束后一次性MODIFY最后COMMIT一次。事务提交的次数越少锁持有时间越短系统压力越小。理解起来很简单一个人去银行办十笔业务是一起结算快还是一笔一笔排队结算快不要在可复用函数里偷偷COMMIT这个建议是写给以后写通用功能模块的。如果你的Function Module会被别的程序调用别在里面直接写COMMIT WORK。为什么因为COMMIT是整个调用链上所有未提交更改的“总放行”不是只提交你这个函数里的东西。调用方可能还有一大堆未提交的数据库修改是想自己控制回滚/提交的。你一个COMMIT下去等于替别人做了决定把人家的事务也给提交了后续人家想回滚都没戏。这就是事务边界被打破了。有经验的做法是可复用的函数只做业务处理把提交决策留给最外层调用者。BAPI倒是例外标准BAPI一般自己管理提交但那是人家定好的规矩我们写自己的FM要克制。再说说调试时遇到的坑绝招在调试器里你可以看到某句更新之后数据库未提交状态。但如果你在调试中直接跳到某行把COMMIT WORK这行跳过那程序结束照样全撤销。又或者你在测试环境里调试手动执行了COMMIT WORK那即使后面代码报错回滚数据也已经落上去了。调试器和运行环境一样都要遵守事务规则。所以别在调试时乱点不然你自以为在测试实际已经改了一堆垃圾数据。给你一个不踩坑的套路写带数据库更新的ABAP程序先想清楚三个点这个事务的“边界”在哪从哪行开始算同一笔事务到哪行截止什么时候COMMIT是程序最末还是某段逻辑结束处万一中间出错了是自动回滚还是需要显式ROLLBACK我的习惯是把COMMIT WORK放在主程序的出口处业务逻辑统统别带COMMIT。除非这个程序足够简单否则我不喜欢在子程序里COMMIT看得人脑壳疼。如果调用了BAPI那就找对应BAPI自带的提交函数像BAPI_TRANSACTION_COMMIT有现成的就用现成的。最后补一句事务提交看着是语法其实是工程决策。你提交的时机、方式决定了数据的一致性、系统的响应速度还有你自己头顶上会不会多几个事故单。多年以后当你因为一个COMMIT漏了而在生产机前怀疑人生你会感谢现在认真记笔记的自己。
延伸阅读

更多相关文章

2026/10/10 18:39:35

大模型面试核心考察维度与高频技术问题解析

1. 大模型面试的核心考察维度解析 2023年被称为大模型技术爆发的元年,国内外科技企业纷纷布局相关岗位。作为从业者,我参与了多家头部企业的技术面试,也担任过面试官角色。从实际经验来看,大模型面试主要聚焦以下五个维度&#xf…

2026/10/13 10:44:33

数学建模代码实现:从理论到实战的工程化指南

1. 从“纸上谈兵”到“代码落地”:数学建模实战的核心挑战 如果你参加过数学建模竞赛,或者在工作中尝试过用数学模型解决实际问题,大概率经历过这样的场景:经过几天的头脑风暴和文献查阅,你和队友终于在白板上画出了一…

2026/10/15 6:33:15

普通显卡也能跑大模型:AirLLM分层推理原理与实践

1. 一张普通显卡能跑大模型?AirLLM到底解决的是什么问题1.1 模型参数、显存和算力的换算关系接触过大模型的朋友应该都见过7B、13B、34B、70B这些说法,这里的B是Billion,指模型参数量。拿一个7B模型举例,如果用常见的16位浮点精度…

2026/10/15 6:33:15

SpringBoot整合MQTT:从Broker部署到生产消费端完整实战

做IoT项目踩过不少通信协议的坑,HTTP在设备端太重、TCP私有协议又难维护,直到把MQTT用起来,才发现设备接入这件事可以这么省心。之前我在一个环境监测类的模拟项目中,用SpringBoot整合MQTT做设备数据上报与指令下发,从…

2026/10/15 6:33:15

小红书推荐算法底层逻辑解析:用数据思维做内容优化

很多人做小红书靠"感觉"发笔记,但真正跑出来的人,都在用数据思维做内容。今天从算法推荐机制的角度,拆解小红书流量分发的底层逻辑。一、小红书推荐算法的三层漏斗小红书的流量分发不是"一发就全量推送",而是…

2026/10/15 6:28:15

AI上下文模式(Context Mode)设计指南:核心参数与避坑实践

前阵子在给一个内部工具加新功能,名字就叫context-mode。说实话,这名字乍一听挺唬人,但本质上就一句话:给AI或者自动化流程加一个“带着记忆干活”的开关。以前用工具的时候,最烦的就是它“每次都像第一次见面”。你上…

2026/10/14 11:31:03

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/14 17:41:07

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/14 2:32:55

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/15 0:02:22

防关联浏览器哪个好?三款产品实测差异解析

新手做多店铺,最纠结的就是防关联浏览器选哪个。飞跨、网易、站斧这三款被问得最多,先给结论:要一体化省心、长期便宜,选站斧;要网易招牌和稳,选网易;预算紧做东南亚 Lazada,选飞跨。…

2026/10/15 0:02:22

影刀RPA深度实战:大模型Fine-tuning定制RPA专用Prompt与指令生成

影刀RPA深度实战:大模型Fine-tuning定制RPA专用Prompt与指令生成 一、技术背景 大模型(LLM)在通用场景下表现强大,但当我们将 GPT-4 或 Qwen 直接用于生成影刀RPA操作指令和 XPath 定位时,准确率通常只有 40%-60%。原因…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑