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.mzph.cn/bicheng/47623.shtml

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

相关文章

接口开发:Orcal数据库的批量修改sql

场景&#xff1a;在日常的CURD中一定会用到批量修改。在我们的项目中&#xff0c;使用的数据库是Orcal&#xff0c;由于之前基本都是使用Mysql的&#xff0c;使用的sql语句也基本都是用mysql的。但是在这次的接口编写时用mysql的批量修改出了问题&#xff0c;刚开始我还以为是写…

如何每天不用动手就可以自动加人

只需要设置一次&#xff0c;批量导入客户号码或是微信号并设置好添加规则&#xff0c;系统就会自动进行添加。

Elastic 线下 Meetup 将于 2024 年 7 月 27 号在深圳举办

2024 Elastic Meetup 深圳站活动&#xff0c;由 Elastic、腾讯、新智锦绣联合举办&#xff0c;现诚邀广大技术爱好者及开发者参加。 时间地点 2024年 7 月 27 日 13:30-18:00 活动地点 中国深圳 南山区海天二路 33 号腾讯滨海大厦 北塔 3 楼多功能厅 ​ 活动流程 14:00-15…

C++ 在Linux环境中生成coredump文件及其调试

第一步&#xff1a;命令行执行 ulimit -c unlimited&#xff0c;然后用ulimit -c 检查是否设置成功&#xff0c;显示unlimited为成功 第二步&#xff1a; 打开/etc/sysctl.conf, 文件末尾添加, 注意确保 /var/core_log 目录存在&#xff0c;也可用别的目录 kern…

对于不懂的如何选择的初学者,Xcode、Visual Studio Code(VS Code)和Lightly这三个工具都有什么特点,分析一下并推荐

对于苹果电脑上学习C语言的初学者&#xff0c;Xcode、Visual Studio Code&#xff08;VS Code&#xff09;和Lightly都是值得考虑的工具。每个工具都有其独特的特点和优势&#xff0c;下面我将分别进行分析&#xff0c;并给出推荐。 Xcode 特点&#xff1a; 官方支持&#xf…

Android 使用WindowManager.LayoutParams窗口参数修改 Dialog 窗口的位置

在Android中&#xff0c;调整Dialog的位置通常可以通过创建一个自定义的Dialog类&#xff0c;并在显示之前设置Dialog的Window参数来实现。以下是一个简单的例子&#xff0c;展示了如何调整Dialog的位置&#xff1a; import android.app.Dialog;import android.content.Contex…

智能家居的优缺点有哪些?

智能家居作为现代科技发展的产物&#xff0c;已经逐渐渗透到我们的日常生活中&#xff0c;为我们的生活带来了诸多便利。然而&#xff0c;它也存在一些不足之处。以下是智能家居的优缺点分析&#xff1a; 优点 安全性提升&#xff1a; 智能家居系统能够增强家庭的安全性。例如…

HTTP请求走私漏洞原理与利用手段分析

文章目录 前言Http请求走私1.1 漏洞诞生场景1.2 漏洞基本原理1.3 HTTP1.1与2.0 请求走私分类2.1 CL.TE类型实例2.2 TE.CL类型实例2.3 TE.TE混淆实例2.4 漏洞检测工具&#xff1f; 请求走私利用3.1 绕过前端安全控制3.2 揭示前端请求重写3.3 捕获他人请求内容3.4 走私构造反射XS…

从数据湖到湖仓一体:统一数据架构演进之路

文章目录 一、前言二、什么是湖仓一体&#xff1f;起源概述 三、为什么要构建湖仓一体&#xff1f;1. 成本角度2. 技术角度 四、湖仓一体实践过程阶段一&#xff1a;摸索阶段(仓、湖并行建设)阶段二&#xff1a;发展阶段方式一、湖上建仓(湖在下、仓在上)方式二&#xff1a;仓外…

Task1 #NLP学习笔记#Datawhale AI训练营#讯飞AI开发者大赛

赛题初体验 十分详细的小白教程&#xff0c;30分钟速通baseline&#xff0c;带我们零基础体验提交作品的全过程&#xff01;从零入门NLP竞赛 - 飞书云文档 (feishu.cn) 四类NLP任务 序列标注&#xff1a;比如中文分词&#xff0c;词性标注&#xff0c;命名实体识别&#xff0…

MySQL运维实战之Clone插件(10.1)使用Clone插件

作者&#xff1a;俊达 clone插件介绍 mysql 8.0.17版本引入了clone插件。使用clone插件可以对本地l或远程的mysql实例进行clone操作。clone插件会拷贝innodb存储引擎表&#xff0c;clone得到的是原数据库的一个一致性的快照&#xff0c;可以使用该快照数据来启动新的实例。cl…

高性能内存对象缓存Memcached原理与部署

Memcached 原理 Memcached 是一个高性能、分布式内存对象缓存系统&#xff0c;主要用于减轻数据库负载、提高Web应用的响应速度和性能。其核心思想是利用内存存储数据&#xff0c;并通过键值对的方式快速读取。以下是Memcached的主要原理&#xff1a; 数据存储 Memcached 使…

C++--copy

copy 拷贝,把源迭代器区间的值拷贝到目的迭代器。使用者保证目的空间足够。时间复杂度O(n)。 函数声明如下: template<class InputIterator, class OutputIterator> OutputIterator copy( InputIterator _First, //源开始迭代器 InputIterator _Last, //源结束迭代…

SpringMVC注解全解析:构建高效Web应用的终极指南 (下)

一. 引言 在上篇文章中&#xff0c;我们介绍了几个重要的SpringMVC注解&#xff1a; SpringBootApplication&#xff1a;Spring Boot项目的启动类注解。RequestMapping&#xff1a;用于映射URL到控制器类或方法&#xff0c;支持多种请求方式。RequestParam&#xff1a;用于绑…

UniVue@v1.5.0版本发布:里程碑版本

前言 以后使用UniVue都推荐使用1.5.0以后的版本&#xff0c;这个版本之后&#xff0c;更新的速度将会放缓。 希望这个框架能够切实的帮助大家更好的开发游戏&#xff0c;做出一款好游戏&#xff01;本开源项目采用的开源协议为MIT协议&#xff0c;完全开源化&#xff0c;以后也…

基于Python+Django+MySQL的心理咨询预约系统

心理咨询预约系统 DjangoMySQL 基于PythonDjangoMySQL的心理咨询预约系统 项目主要依赖Django3.2&#xff0c;MySQL 支持随机验证码生成与登录验证 简介 基于PythonDjangoMySQL的心理咨询预约系统通过连接数据库获取数据&#xff0c;登录新增随机数字验证码验证。具体可以看…

基于matlab的深度学习案例及基础知识专栏前言

专栏简介 内容涵盖深度学习基础知识、深度学习典型案例、深度学习工程文件、信号处理等相关内容&#xff0c;博客由基于matlab的深度学习案例、matlab基础知识、matlab图像基础知识和matlab信号处理基础知识四部分组成。 一、 基于matlab的深度学习案例 1.1、matlab:基于模…

量化机器人如何提升交易透明度?

量化机器人通过其高度的自动化和数据驱动的交易决策&#xff0c;为金融市场带来了前所未有的交易透明度。这些机器人使用先进的算法来分析市场数据&#xff0c;并根据这些数据作出交易决策&#xff0c;从而减少了人为偏见和操纵的可能性&#xff0c;提高了交易的公正性和透明度…

【机器学习】机器学习与图像分类的融合应用与性能优化新探索

文章目录 引言第一章&#xff1a;机器学习在图像分类中的应用1.1 数据预处理1.1.1 数据清洗1.1.2 数据归一化1.1.3 数据增强 1.2 模型选择1.2.1 卷积神经网络1.2.2 迁移学习1.2.3 混合模型 1.3 模型训练1.3.1 梯度下降1.3.2 随机梯度下降1.3.3 Adam优化器 1.4 模型评估与性能优…

精确控制依赖:使用Yarn安装特定commit的包

在软件开发过程中&#xff0c;依赖管理是一个关键环节。Yarn 是一个流行的 JavaScript 包管理工具&#xff0c;它不仅提供基本的包安装功能&#xff0c;还支持更高级的依赖管理技巧&#xff0c;比如安装特定目录下的特定 commit。本文将详细介绍如何使用 Yarn 安装一个包的特定…