ABAP 中的自治事务模拟

Posted

技术标签:

【中文标题】ABAP 中的自治事务模拟【英文标题】:Autonomous transaction analogue in ABAP 【发布时间】:2022-01-04 09:07:25 【问题描述】:

我正在尝试在主程序仍在运行而不提交的情况下在数据库表中提交 DML 更新,因为将来可能会出现错误并且可能需要回滚它,但内部(已保存)更新应该保留. 就像在 Oracle 自治事务中一样。

Call function ... starting new task ...Submit ... and return 不起作用,因为它们会影响主事务。

有没有办法在不中断主 LUW 的情况下启动嵌套数据库 LUW 并提交它?

【问题讨论】:

是否可以将“嵌套更新”移动到“主更新”前面,例如 prepare( ). COMMIT WORK. main( ) ?嵌套两个事务还意味着您会看到两种不同的数据库状态,具体取决于您所在的事务。 你说“[aRFC] 或 Submit [...] 不起作用,因为它们会影响主事务”,我不同意,只有 Submit 在同一个数据库 LUW 中运行, aRFC 在其自己的数据库 LUW 中运行。如果您想继续讨论 aRFC,请澄清。请注意,ABAP SQL 允许本地“服务连接”,以便在同一个 ABAP LUW 中启动不同的数据库 LUW(所有 ABAP SQL 语句中的CONNECTION 字,连接以名称R/3* 开头)。 【参考方案1】:

您可以创建单独的函数来保存您的更改,您可以使用 开始新任务 模式调用您的函数,如下所示。

  call function 'ZFUNCTION' starting new task 'SAVECHANGES'
   exporting
     param  = value.

【讨论】:

问题说他们已经尝试过了,但没有成功。 “调用函数开始新任务或提交并返回不起作用,因为它们会影响主事务。” @Philipp 它正在工作。也许他们还有另一个问题。【参考方案2】:

我不知道如何使用 OpenSQL 执行此操作。但是当你使用ADBC framework时,那么CL_SQL_CONNECTION类的每个实例operates within a separate database LUW。

我一般不建议使用 ADBC,除非你必须这样做,因为:

您现在将 SQL 语句编写为字符串,这意味着您没有编译时语法检查。 您不能再将变量放入 SQL 代码中。 (好吧,你可以,但你不应该,因为你可能会以这种方式创建 SQL 注入漏洞)。您需要使用statement->set_param 传递所有变量。 您现在正在编写 NativeSQL,这意味着您可能会无意中编写无法移植到其他数据库后端的 SQL。

【讨论】:

“我不知道如何使用 OpenSQL 执行此操作” 是否可以创建与主数据库的辅助数据库连接? (虽然这不是一个好主意......)

以上是关于ABAP 中的自治事务模拟的主要内容,如果未能解决你的问题,请参考以下文章

自治事务中的 Oracle DDL

Oracle与SQL自治事务

Oracle自治事务实际用例

使用自治事务触发

自治事务范围和错误引发

自治事务在 Oracle 中有自己的会话吗?