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的区别的一些总结,希望对你有帮助!
相关文章:
ABAP使用SQL直接更新数据库与使用IN UPDATE TASK的区别
1. 背景 刚接触ABAP的小伙伴常常会有这样的疑问,为什么不直接使用Open SQL直接更新数据库,而要把对DB的操作封装到IN UPDATE TASK中呢? 对于这个问题,比较常见的解释是,IN UPDATE TASK的方式会保证数据更新的一致性。…...
Android GWP-Asan使用与实现原理
目录 一、 背景 二、GWP-Asan介绍 2.1 什么是GWP-ASan 2.2 GWP-Asan与其他几类工具对比 2.3 GWP-ASan与其它内存分配器的兼容性 三、GWP-Asan如何使用 3.1 app进程 3.2 native进程 四、GWP-Asan实现原理 4.1 进程启用GWP-Asan 4.2 初始化 4.3 内存分配 4.3.1 内存…...
SpringBoot 跨域请求处理全攻略:从原理到实践
文章目录 SpringBoot 如何处理跨域请求?你能说出几种方法?跨域请求概述跨域解决方案1. 使用CrossOrigin注解2. 使用WebMvcConfigurer配置类3. 使用过滤器(Filter)4. 使用Spring Security处理CORS5.使用Spring Cloud Gateway处理CO…...
vulnhub——Ai-Web1靶机渗透
Ai-Web1靶机渗透 靶机下载: 官网地址:https://www.vulnhub.com/entry/ai-web-1,353/ 攻击机:kali2024 一、信息收集 发下目标主机的IP为:192.168.201.141 用nmap工具扫描一下对方主机和服务 发现他打开了80端口 发现搜不到于是…...
sqlalchemy事件监听
sqlalchemy事件监听 SQLAlchemy 中的事件监听允许您在特定事件发生时执行自定义的 Python 代码。这些事件可以是与ORM(对象关系映射)或核心组件相关的操作,比如表、类、会话或事务的插入、更新、删除等操作。通过事件监听,您可以实现日志记录、审计或执行业务规则等功能。…...
【Django+Vue3 线上教育平台项目实战】Celery赋能:优化订单超时处理与自动化定时任务调度
文章目录 前言⭐✨💫🔥📖一、Celery⭐1.基本概念及介绍:✨2.使用步骤💫 二、订单超时 取消订单(Celery)🔥具体实现流程📖 前言⭐✨💫🔥📖 在构建复…...
CSS3 教程
CSS3 教程 引言 CSS3,即层叠样式表的第三代,是网页设计和开发中不可或缺的技术之一。它为HTML元素提供了丰富的样式定义,使得网页不仅内容丰富,而且外观美观、交互性强。本教程将详细介绍CSS3的基础知识、高级特性以及最佳实践&…...
树与二叉树学习笔记
树与二叉树 计算机中的树树的概念树的类型 什么是二叉树二叉树:定义与特点二叉树:前序、中序、后序遍历二叉树:深度、广度优先遍历二叉树:线索化二叉树:序列化与反序列化 haffman树平均编码长度构建haffman树haffman树…...
消费金融系统开发回忆录
架构设计图 整个支付链路上的功能 支付系统应该有:账户管理、渠道管理、支付管理、对账管理、清算管理、结算管理 一笔支付订单,在支付系统侧就是要记录清楚,谁发起的、对哪个商品进行支付、通过哪个渠道支付、支付时间、支付结果等…...
org.springframework.context.ApplicationContext发送消息
1、创建消息的实体类 package com.demo;/*** 监听的实体类**/ public class EventMessage {private String name;public EventMessage(String name) {this.name name;}public String getName() {return name;}public void setName(String name) {this.name name;} }2、创建消…...
Java8-21新特性
简介 由于Java官方最近更新越来越频繁,而长期支持维护的版本LTS版每隔几年才推出一个,大规模商用的JDK只可能选择LTS版,因此这里只简单记录JDK8,11,17,21。 jdk8 Lambda表达式: Lambda表达式…...
NodeJS系列面试题
大家好,我是有用就扩散,有用就点赞。 有没有写过Koa中间件,说一下中间件原理,介绍下自己写过的中间件 koa本来就是一个轻量级框架,本身支持的功能并不多,功能都是通过中间件来实现不同的需求。开发者可以通…...
QXlsx读写excel
QXlsx读写excel 安装 QXlsx使用 qmake使用 CMake 基本用法1. 写入 Excel 文件2. 读取 Excel 文件 详细用法1. 设置单元格样式2. 合并单元格3. 创建图表4. 设置列宽和行高 完整示例 QXlsx 是一个用于在 Qt 应用中读写 Excel 文件的第三方库。它提供了丰富的 API,可以…...
昇思25天学习打卡营第13天 | mindspore 实现 ShuffleNet 图像分类
1. 背景: 使用 mindspore 学习神经网络,打卡第 13 天;主要内容也依据 mindspore 的学习记录。 2. 迁移学习介绍: mindspore 实现 ShuffleNet 图像分类; ShuffleNet 基本介绍: ShuffleNetV1 是旷视科技提…...
C语言超市管理系统UI界面
以下是部分代码。需要源码的私信 #include<easyx.h> #include<stdio.h> #include<stdlib.h>#define width 1280 #define height 840 #define font_w 35 //字体宽度 #define font_h 90 //字体高度typedef struct node {char name[100];//名字char number[1…...
BUUCTF逆向wp [MRCTF2020]Xor
第一步 查壳,该题是32位,无壳。 第二步 跟进main,发现反汇编不了 通过下图我们可以发现一串类似字符串的东西 第三步 我们看一下汇编 我们可以得到这些信息:flag的长度为27(下面是对本条指令cmp edx 27指令的应用…...
Windows版MySQL5.7解压直用(如何卸载更换位置重新安装)
文章目录 停止mysql进程及服务迁移整个mysql文件夹删除data重启计算机重新安装 停止mysql进程及服务 net stop mysql mysqld -remove mysql迁移整个mysql文件夹 删除data 重启计算机 shutdown -r -t 0重新安装 https://blog.csdn.net/xzzteach/article/details/137723185...
详解数据结构之二叉树(堆)
详解数据结构之二叉树(堆) 树 树的概念 树是一个非线性结构的数据结构,它是由 n(n>0)个有限节点组成的一个具有层次关系的集合,它的外观形似一颗倒挂着的树,根朝上,叶朝下,所以称呼为树。每颗子树的根节点有且只…...
Linux----Mplayer音视频库的移植
想要播放视频音乐就得移植相关库到板子上 Mplayer移植需要依赖以下源文件:(从官网获取或者网上) 1、zlib-1.2.3.tar.gz :通用的内存空间的压缩库。 2、libpng-1.2.57.tar.gz :png格式图片的压缩或解压库 3、Jpegsrc.v9b.tar.gz : jpeg格式图片的压…...
STM32测测速---编码电机读取速度的计算
1、首先先了解一下计算的公式 速度计算: 轮胎每转一圈的脉冲数取决于编码器的分辨率,可由下面公式进行计算: PPR是电机的线数 以GA25-370电机为例。 图片来源:第四节:STM32定时器(4.JGA25-370霍尔编码器…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
