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://www.rhkb.cn/news/379411.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Artix7系列FPGA实现SDI视频编解码+UDP以太网传输,基于GTP高速接口,提供工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本博已有的以太网方案本博已有的FPGA图像缩放方案本方案的缩放应用本方案在Xilinx--Kintex系列FPGA上的应用本方案在Xilinx--Zynq系列FPGA上的应用 3、详细设计方案设计原理框图SDI 输入设备Gv8601a 均衡…

STM32智能城市交通管理系统教程

目录 引言环境准备智能城市交通管理系统基础代码实现&#xff1a;实现智能城市交通管理系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;城市交通管理与优化问题解决方案与优化收尾与总结 1. 引言 智能城…

Chromium CI/CD 之Jenkins实用指南2024- Windows节点开启SSH服务(七)

1.引言 在现代软件开发和持续集成的过程中&#xff0c;自动化部署和远程管理是不可或缺的关键环节。SSH&#xff08;Secure Shell&#xff09;协议以其强大的安全性和灵活性&#xff0c;成为连接和管理远程服务器的首选工具。对于使用Windows虚拟机作为Jenkins从节点的开发者而…

谷粒商城-全文检索-ElasticSearch

1.简介 一个分布式的开源搜索和分析引擎,可以 秒 级的从海量数据中检索 主要功能:做数据的检索和分析(MySQL专攻于数据的持久化存储与管理CRUD达到百万以上的数据MSQL就会很慢,海量数据的检索和分析还是要用ElasticSearch) 用途:我们电商项目里的所有的检索功能都是由Elasti…

均值滤波算法及实现

均值滤波器的使用场景&#xff1a; 均值滤波器使用于处理一些如上述蓝色线的高斯噪声场景 红色曲线是经过均值滤波处理后的数据。主要因为均值滤波设置数据缓冲区&#xff08;也即延时周期&#xff09;&#xff0c;使得测量值经过缓冲不会出现特别大的变化。 黄色曲线为高斯噪声…

【Node.js】初识 Node.js

Node.js 概念 Node.js 是一个开源与跨平台的 JavaScript运行时环境 &#xff0c;在浏览器外运行 V8 JavaScript 引擎(Google Chrome的内核)&#xff0c;利用事件驱动、非阻塞和异步输入输出 等技术提高性能。 可以理解为 Node.js就是一个服务器端的、非阻塞式 l/O 的、事件驱…

香橙派AIpro-携手华为-为AI赋能

文章目录 香橙派AIpro-携手华为-为AI赋能开箱和功能介绍开箱功能介绍 环境搭建镜像烧录进入系统 测试项目YOLOv5部署YOLOv5识别单张图片实时识别视频使用Ascend测试yolov5 产品评价 香橙派AIpro-携手华为-为AI赋能 今天新入手了一款香橙派AIPro&#xff0c;让我们一起跟着文章…

【iOS】—— 消息传递和消息转发

【iOS】—— 消息传递和消息转发 1. 消息传递SEL选择子IMP快速查找汇编代码查找过程总结消息转送快速查找IMP 慢速查找总结消息传递慢速查找IMP 2. 消息转发动态决议动态解析添加方法 快速转发慢速转发 总结动态决议消息转发消息的三次拯救 1. 消息传递 在iOS中&#xff0c;消…

python 获取Shopee虾皮商家店铺商品列表 虾皮api数据采集

此api接口可用于获取虾皮平台商家店铺的商品列表&#xff0c;目前land参数支持id、vn、my、th、sg、ph、tw&#xff08;印尼、越南、马来、泰国、新加坡、菲律宾、台湾&#xff09;。 若有需要&#xff0c;请点击文末链接联系我们。 详细采集页面如下https://shopee.tw/yuesh…

【Python】数据处理(mongodb、布隆过滤器、索引)

数据 数据预处理 df pd.read_csv(file_path, encodingANSI) csv的编码方式一定要用 ANSI。要不然会出现各种报错 import pandas as pd from datetime import datetime# 读取CSV文件 file_path book_douban.csv df pd.read_csv(file_path, encodingANSI)# 定义一个函数来…

【信号频率估计】MVDR算法及MATLAB仿真

目录 一、MVDR算法1.1 简介1.2 原理1.3 特点1.3.1 优点1.3.2 缺点 二、算法应用实例2.1 信号的频率估计2.2 MATLAB仿真代码 三、参考文献 一、MVDR算法 1.1 简介 最小方差无失真响应&#xff08;Mininum Variance Distortionless Response&#xff0c;MVDR&#xff09;算法最…

最新开源的解析效果非常好的PDF解析工具MinerU (pdf2md pdf2json)

毫不夸张的说 PDF解析工具MinerU是照进RAG黑暗中的一道光——这是我对它的评价。我测过太多了文档解析工具&#xff01; 最近在做文档解析的工作。看了很多的开源的文档解析的工具&#xff0c;版面分析的工具&#xff0c;其中包括paddelpaddel这样30kstar的明星工具。但是效果都…

electron项目中实现视频下载保存到本地

第一种方式&#xff1a;用户自定义选择下载地址位置 渲染进程 // 渲染进程// 引入 import { ipcRenderer } from "electron";// 列表行数据下载视频操作&#xff0c;diffVideoUrl 是视频请求地址 handleDownloadClick(row) {if (!row.diffVideoUrl) {this.$message…

【数据结构】二叉树———Lesson2

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

网安小贴士(17)认证技术原理应用

前言 认证技术原理及其应用是信息安全领域的重要组成部分&#xff0c;涉及多个方面&#xff0c;包括认证概念、认证依据、认证机制、认证类型以及具体的认证技术方法等。以下是对认证技术原理及应用的详细阐述&#xff1a; 一、认证概述 1. 认证概念 认证是一个实体向另一个实…

【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析

初阶数据结构相关知识点可以通过点击以下链接进行学习一起加油&#xff01;时间与空间复杂度的深度剖析深入解析顺序表:探索底层逻辑深入解析单链表:探索底层逻辑深入解析带头双向循环链表:探索底层逻辑深入解析栈:探索底层逻辑深入解析队列:探索底层逻辑深入解析循环队列:探索…

Chromium CI/CD 之Jenkins实用指南2024 - 常见的构建错误(六)

1. 引言 在前一篇《Chromium CI/CD 之 Jenkins - 发送任务到Ubuntu&#xff08;五&#xff09;》中&#xff0c;我们详细讲解了如何将Jenkins任务发送到Ubuntu节点执行&#xff0c;并成功验证了文件的传输和回传。这些操作帮助您充分利用远程节点资源&#xff0c;提升了构建和…

CrossKD: Cross-Head Knowledge Distillation for Dense Object Detection

CrossKD&#xff1a;用于密集目标检测的交叉头知识蒸馏 论文链接&#xff1a;https://arxiv.org/abs/2306.11369v2 项目链接&#xff1a;https://github.com/jbwang1997/CrossKD Abstract 知识蒸馏(Knowledge Distillation, KD)是一种有效的学习紧凑目标检测器的模型压缩技术…

Uniapp 组件 props 属性为 undefined

问题 props 里的属性值都是 undefined 代码 可能的原因 组件的名字要这样写&#xff0c;这个官方文档有说明

【转盘案例-弹框-修改Bug-完成 Objective-C语言】

一、我们来看示例程序啊 1.旋转完了以后,它会弹一个框,这个框,是啥, Alert 啊,AlertView 也行, AlertView,跟大家说过,是吧,演示过的啊,然后,我们就用iOS9来做了啊,完成了以后,我们要去弹一个框, // 弹框 UIAlertController *alertController = [UIAlertContr…