在 SAP NetWeaver AS ABAP 环境里,数据库提交
(Database Commit) 并不仅仅发生在显式执行 COMMIT WORK
这样的 Open SQL 语句时;每当工作进程发生切换或等待被打断,运行时框架都会自动执行隐式提交,它会立即关闭所有已打开的数据库游标并结束当前的数据库 LUW
(Logical Unit of Work)。一旦开发人员在 SELECT … ENDSELECT
循环或 OPEN CURSOR
之后不慎触发这些场景,结果可能是游标失效、锁意外释放,甚至数据被意外持久化。本篇博客全面梳理隐式提交产生的九大场景,配合真实案例与代码片段,帮助读者从根源理解问题,并给出可落地的防御策略。
技术背景与核心概念
数据库 LUW 与 SAP LUW
在经典三层架构里,数据库 LUW 代表一次原子事务,而 SAP LUW 可能跨越多个数据库 LUW,因为同一个 ABAP 程序在一次用户会话期间可能被不同的工作进程轮流执行。每当工作进程因对话步骤结束、RFC 调用或等待语句被挂起时,系统必须先向数据库提交当前 LUW,以确保下一个工作进程拥有干净的一致状态。
“提交即关闭游标”规律
所有数据库游标都依赖于事务上下文。一旦事务提交,无论显式还是隐式,未取完的数据行句柄将全部作废。程序继续使用这些游标会抛出 CX_SY_OPEN_SQL_DB
等异常,或者读取到空数据集。这便是我们强调“切