ABAP使用SQL直接更新数据库与使用IN UPDATE TASK的区别

1. 背景

刚接触ABAP的小伙伴常常会有这样的疑问,为什么不直接使用Open SQL直接更新数据库,而要把对DB的操作封装到IN UPDATE TASK中呢?

对于这个问题,比较常见的解释是,IN UPDATE TASK的方式会保证数据更新的一致性。因为,它注册了一个SAP LUW,在这个逻辑业务单元中的操作,将会一起成功/失败。

这个解释是没问题的,但可能还是稍微缺少点直观的感觉。在本篇博客中,让我们一起通过几个测试,来更深入地理解下IN UPDATE TASK的用法。

2. 测试

2.1 测试1 - Open SQL 与IN UPDATE TASK混合使用

首先,让我们测试下,如果Open SQL 与 IN UPDATE TASK混合使用会发生什么?

建立一个UPDATE Module的Function Module ZUPDATE_MODULE_1.
在这里插入图片描述

在这个函数中,我们将完成一条数据的插入。

FUNCTION zupdate_module_1.BREAK-POINT.FINAL(ls_spfli) = VALUE spfli( carrid    = 'LH'connid    = '456' ).INSERT INTO spfli VALUES @ls_spfli.

然后,让我们在程序ztest_luw中,使用Open SQL插入另一条数据,同时调用更新模块函数zupdate_module_1

REPORT ztest_luw.START-OF-SELECTION.FINAL(ls_spfli) = VALUE spfli( carrid    = 'LH'connid    = '123' ).INSERT INTO spfli VALUES @ls_spfli.CALL FUNCTION 'ZUPDATE_MODULE_1' IN UPDATE TASK.BREAK-POINT.COMMIT WORK.BREAK-POINT.

在程序中,我已经预设了断点,让我们看一下运行效果。

当执行到Commit Work后,系统会开启一个新的进程,用于执行zupdate_module_1,而在当前的dialog session中的Open SQL已经完成了数据的更新。

在这里插入图片描述

这样做的结果是:当前会话进程所提交的数据库更新,与IN UPDATE TASK所提交的数据库更新,相互独立。带来的后果是,两部分数据更新也是相互独立的。
若IN UPDATE TASK更新失败,会话进程的更新并不受影响。

整体上看,这样实际产生了两个独立的LUW,一个是会话进程中OPEN SQL带来的,另一个是IN UPDATE TASK带来的。

在SAP的标准代码中,会出现类似的场景,但不推荐这样用。因为,这样做的前提是,开发者或业务逻辑的负责人,要清楚地知道其影响与后果,一次业务操作后,可能引发部分操作成功,部分操作失败

而在绝大多数场景中,我们最期望的效果是,程序运行可以简单直接,更新全部成功或全部失败。

2.2 测试2 - COMMIT WORK AND WAIT的效果

我们知道COMMIT WORK AND WAIT的效果是同步更新,也即触发新的更新进程,但要等到更新进程执行结束后,会话进程才会继续。

若在测试1的场景中,使用COMMIT WORK AND WAIT替代COMMIT WORK,会有什么影响呢?

START-OF-SELECTION.FINAL(ls_spfli) = VALUE spfli( carrid    = 'LH'connid    = '123' ).INSERT INTO spfli VALUES @ls_spfli.CALL FUNCTION 'ZGG_UPDATE_MODULE_1' IN UPDATE TASK.BREAK-POINT.COMMIT WORK AND WAIT. " <<-------what will happen?BREAK-POINT.

其运行效果如下:
在这里插入图片描述

可见COMMIT WORK AND WAIT的效果和COMMIT WORK的效果是类似的。COMMIT WORK AND WAIT仍会触发新的更新进程,并且独立于当前的会话进程,会话进程虽然被WAIT阻塞,但会话进程中对于数据库的提交并不受影响。

2.3 测试3 - SET UPDATE TASK LOCAL 的效果

通过SET UPDATE TASK LOCAL可以让IN UPDATE TASK不启动新的更新进程,让我们测试一下,SET UPDATE TASK LOCAL在OPEN SQL与IN UPDATE TASK混用场景中的效果。

改动代码如下:

START-OF-SELECTION.FINAL(ls_spfli) = VALUE spfli( carrid    = 'LH'connid    = '123' ).INSERT INTO spfli VALUES @ls_spfli.SET UPDATE TASK LOCAL.  "<<---set before registeringCALL FUNCTION 'ZGG_UPDATE_MODULE_1' IN UPDATE TASK.BREAK-POINT.COMMIT WORK AND WAIT.BREAK-POINT.

其运行效果如下:
在这里插入图片描述

可以发现,通过SET UPDATE TASK LOCAL,将会直接使用当前的会话进程完成对于IN UPDATE TASK注册函数的执行,并未触发新的更新进程。

在此例中,通过SET UPDATE TASK LOCAL,实现了LUW的合并。

OPEN SQL所提交的数据库更新和IN UPDATE TASK提交的数据库更新同属一个LUW,会一起成功,一起失败。

3. 总结

通过本文中的几个测试,我们可以看到IN UPDATE TASK对程序带来的影响。

总结使用经验的话,推荐将所有的数据库更新操作,统一通过IN UPDATE TASK注册,不要在会话进程中通过OPEN SQL提交数据库的更新操作,而是将这些操作封装到IN UPDATE TASK中。

但又有小伙伴问了,若是所有的数据库更新操作都在当前的会话进程中,不也能保证数据的一致性嘛?

答案是“肯定的”。这种方式确实是保证了进程中只有一个LUW。但在实际场景中,对于数据库的操作其实是“一系列”的动作,并非简单一句INSERT或UPDATE。将这些操作封装到IN UPDATE TASK中进行异步更新,将会让终端用户的操作更加流畅。

因为,当所有的输入信息和校验通过后,用户便可以结束当前的会话进程,而不必等待所有的数据库更新结束后才能结束会话。

但注意,任何事情都不是绝对的,如果一个应用程序的逻辑十分简单,数据库更新操作的数据量也很小,不使用IN UPDATE TASK,直接在会话进行中使用OPEN SQL更新数据库,也是可以的。

要避免的场景是,在会话进程通过OPEN SQL更新数据库,与通过IN UPDATE TASK更新数据库,在同一程序中的混合使用!

以上,是本文对于ABAP中使用SQL直接更新数据库与使用IN UPDATE TASK的区别的一些总结,希望对你有帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3249955.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

AI 模型本地推理 - YYPOLOE - Python - Windows - GPU - 吸烟检测(目标检测)- 有配套资源直接上手实现

Python 运行 - GPU 推理 - windows 环境准备python 代码 环境准备 FastDeploy预编译库下载 conda config --add channels conda-forge && conda install cudatoolkit11.2 cudnn8.2 pip install fastdeploy_gpu_python-0.0.0-cp38-cp38-win_amd64.whlpython 代码 impo…

2024算力基础设施安全架构设计与思考(免费下载)

算网安全体系是将数据中心集群、算力枢纽、一体化大数据中心三个层级的安全需求进行工程化解耦&#xff0c;从国家安全角度统筹设计&#xff0c;通过安全 服务化方式&#xff0c;依托威胁情报和指挥协同通道将三层四级安全体系串联贯通&#xff0c;达成一体化大数据安全目标。 …

Yum包下载

1. 起因 内网有一台服务器需要升级php版本,维护的同学又不想二进制安装.服务器只有一个光盘的yum仓库 2. 解决方法 解决思路如下: 外网找一台机器配置php8.3.8的仓库外网服务器下载软件集并打包内网服务器上传并解压实现升级 2.1 下载php8.3.8仓库 配置php仓库 rootcent…

油猴脚本入门(微信读书显示当前时间)

简介 油猴&#xff08;Tampermonkey&#xff09;是一个流行的浏览器扩展&#xff0c;主要用于管理用户脚本。用户脚本是一种运行在网页上的小型脚本程序&#xff0c;可以改变网页的外观或功能。它们通常由用户自己编写或下载&#xff0c;并通过油猴这样的扩展在浏览器中运行。…

如何用手机压缩视频?手机压缩视频方法来了

高清视频的大文件大小常常成为分享和存储的障碍&#xff0c;尤其是在数据流量有限或存储空间紧张的情况下。幸运的是&#xff0c;无论是智能手机还是个人电脑&#xff0c;都有多种方法可以帮助我们轻松压缩视频文件&#xff0c;以适应不同的需求和情境。本文将介绍如何在手机上…

采用T网络反馈电路的运算放大器(运放)反相放大器

运算放大器(运放)反相放大器电路 设计目标 输入电压ViMin输入电压ViMax输出电压VoMin输出电压VoMaxBW fp电源电压Vcc电源电压Vee-2.5mV2.5mV–2.5V2.5V5kHz5V–5V 设计说明1 该设计将输入信号 Vin 反相并应用 1000V/V 或 60dB 的信号增益。具有 T 反馈网络的反相放大器可用…

浅聊 Three.js 屏幕空间反射SSR-SSRShader

浅聊 Three.js 屏幕空间反射SSR(2)-SSRShader 前置基础 渲染管线中的相机和屏幕示意图 -Z (相机朝向的方向)||| -------------- <- 屏幕/投影平面| | || | || | (f) | <- 焦距| | ||…

One-Class SVM

前提知识&#xff1a;支持向量机&#xff08;SVM&#xff09;-CSDN博客 主要思想 找一个超平面将样本中的正例圈出来&#xff0c;预测就是用这个超平面做决策&#xff0c;在圈内的样本就认为是正样本&#xff0c;圈外的是其他样本&#xff0c;如图1所示&#xff1a; 图1 OSVM…

PostgreSQL 中如何处理数据的唯一性约束?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 PostgreSQL 中如何处理数据的唯一性约束&#xff1f;一、什么是唯一性约束二、为什么要设置唯一性约束…

酷炫末世意境背景404单页HTML源码

源码介绍 酷炫末世意境背景404单页HTML源码&#xff0c;背景充满着破坏一切的意境&#xff0c;彷佛末世的到来&#xff0c;可以做网站错误页或者丢失页面&#xff0c;将下面的代码放到空白的HTML里面&#xff0c;然后上传到服务器里面&#xff0c;设置好重定向即可 效果预览 …

经典神经网络(14)T5模型原理详解及其微调(文本摘要)

经典神经网络(14)T5模型原理详解及其微调(文本摘要) 2018 年&#xff0c;谷歌发布基于双向 Transformer 的大规模预训练语言模型 BERT&#xff0c;而后一系列基于 BERT 的研究工作如春笋般涌现&#xff0c;预训练模型也成为了业内解决 NLP 问题的标配。 2019年&#xff0c;谷歌…

拖拽上传(预览图片)

需求 点击上传图片&#xff0c;或直接拖拽图片到红色方框里面也可上传图片&#xff0c;上传后预览图片 效果 实现 <!DOCTYPE html> <html lang"zh-cn"><head><meta charset"UTF-8"><meta name"viewport" content&…

redis server response timeout(3000ms) occurred after 3 retry attempts异常分析

读取redis数据报超时错误&#xff1a; Redis server response timeout (3000 ms) occured after 3 retry attempts2024-07-18 17:07:57.124 ERROR [e8f07b0a671c08311dff589827897232] [http-nio-9528-exec-6] c.z.i.u.m.c.e.BaspUserExceptionHandler.exceptionHandler:83 - R…

FlinkSql概述

FlinkSql概述 一、Flink SQL概述1.流处理中的表2.将流转换成动态表3.将动态表转换为流 二、时间属性1.事件时间2.处理时间 一、Flink SQL概述 Table API和SQL是最上层的API&#xff0c;在Flink中这两种API被集成在一起&#xff0c;SQL执行的对象也是Flink中的表&#xff08;Tab…

SQL每日一题:删除重复电子邮箱

题干 表: Person -------------------- | Column Name | Type | -------------------- | id | int | | email | varchar | -------------------- id 是该表的主键列(具有唯一值的列)。 该表的每一行包含一封电子邮件。电子邮件将不包含大写字母。 编写解决方案 删除 所有重复…

js vue axios post 数组请求参数获取转换, 后端go参数解析(gin框架)全流程示例

今天介绍的是前后端分离系统中的请求参数 数组参数的生成&#xff0c;api请求发送&#xff0c;到后端请求参数接收的全过程示例。 为何会有这个文章&#xff1a;后端同一个API接口同时处理单条或者多条数据&#xff0c;这样就要求我们在前端发送请求参数的时候需要统一将请…

ViT(论文解读):An Image is worth 16*16 words

研究问题 虽然transformer已经成为NLP领域的标准&#xff08;BERT、GPT3、T5&#xff09;&#xff0c;但是在CV领域很有限。在CV中&#xff0c;自注意力要么和CNN一起用&#xff0c;要么替换CNN中某个组件后保持整体结构不变。本文证明了对CNN的这种依赖并不必要&#xff0c;在…

简单工厂、工厂方法与抽象工厂之间的区别

简单工厂、工厂方法与抽象工厂之间的区别 1、简单工厂&#xff08;Simple Factory&#xff09;1.1 定义1.2 特点1.3 示例场景 2、工厂方法&#xff08;Factory Method&#xff09;2.1 定义2.2 特点2.3 示例场景 3、抽象工厂&#xff08;Abstract Factory&#xff09;3.1 定义3.…

关于Centos停更yum无法使用的解决方案

最近在使用Centos7.9系统时候&#xff0c;发现yum仓库无法进行安装软件包了&#xff0c;官方说2024年6月30日进行停更&#xff0c;停更后无法提供对应的软件服务。 我在使用yum安装包的时候发现确实不能使用官方服务了&#xff1a; CentOS停更的影响 CentOS停止更新之后&#…

CentOS 7报错:yum命令报错 “ Cannot find a valid baseurl for repo: base/7/x86_6 ”

参考连接&#xff1a; 【linux】CentOS 7报错&#xff1a;yum命令报错 “ Cannot find a valid baseurl for repo: base/7/x86_6 ”_centos linux yum search ifconfig cannot find a val-CSDN博客 Centos7出现问题Cannot find a valid baseurl for repo: base/7/x86_64&…