ABAP语法数据库更新.docx
《ABAP语法数据库更新.docx》由会员分享,可在线阅读,更多相关《ABAP语法数据库更新.docx(28页珍藏版)》请在冰豆网上搜索。
ABAP语法数据库更新
1编程数据库更新
概览
要有效地进行编程数据库更新,程序员必须主要关注于:
内容
SAP数据库环境
R/3体系结构:
概述
SAP系统中的事务
更新绑定介绍
SAP锁定介绍
更新编程技术
维护数据库完整性
优化事务性能
未绑定的更新
在对话任务中的绑定更新
更新任务中的绑定更新
后台任务中的绑定更新
COMMITWORK处理
ROLLBACKWORK处理
后台处理考虑
绑定更新的错误处理
SAP系统中的锁定
定义锁定对象
调用ENQUEUE/DEQUEUE功能模块
_保持数据库的正确性
_优化用户的反应时间
SAP系统提供了许多更新数据库的方法。
每种方法都利用了SAP体系结构的不同特征。
本章用以描述这些方法并提供选择最适合用户应用程序的方法指南。
下列主题提供信息:
SAP数据库环境(页1)
更新编程技术(页5)
SAP系统中的锁定(页14)
1SAP数据库环境
如果正在事务中更新数据库,那么SAP数据库环境提供可想而知的一些专用特征。
关于编程更新之前的快速入门,参见:
SAP系统中的事务(页2)
更新绑定介绍(页3)
SAP锁定介绍(页5)
1R/3体系结构:
概述
为了了解R/3系统如何执行数据库更新,应该熟悉R/3体系结构。
客户机/服务器配置
SAP的三级客户机/服务器配置包括演示(用户前端),应用逻辑(用户处理对话)和数据存储(执行数据库请求)。
演示服务器使用SAPGUI程序提供R/3用户界面。
如果用户启动事务,则SAPGUI传递条目到调度程序。
调度程序将挂起的处理任务分配给多个工作进程。
具体的工作进程数取决于配置。
工作进程可以直接访问数据库,该数据库使用共享服务在不同的计算机上存储。
多用户系统
该对话工作进程交替控制当前用户会话。
如果用户输入动态处理请求系统处理,则调度程序将其放入队列。
一旦对话工作进程为空,则队列顶部的作业将被分配给该进程以便进行处理。
然后,对话工作进程执行一对话步骤。
每次更改屏幕之后,都将触发数据库的提交。
这样将清空屏幕间的对话进程,以允许其处理由调度程序所分配的新对话步骤。
切换工作进程和更新数据库.
由于已将任务分配给了空的工作进程,因此必须优化系统资源的使用并优化负载的承担。
但是,设计事务流时,事务开发者必须记住在事务处理期间工作进程必须切换多次。
如果事务更改了数据库,那么,此事实十分重要,因为一旦工作进程清空,则系统释放数据库锁定并关闭数据库光标。
要保持更改正确,必须知道该点何时到达以及应采取的行动。
本章将说明用于编程的校正和有效数据库更改的技术。
ABAP/4提供的优化数据库更新的技术独立于基础数据库,并且符合对话编程的特别要求。
更新和排队服务
除对话进程外,每个R/3系统包含一个或多个更新服务和一个排队服务。
使用这些服务更新R/3中的数据库
对话事务可以直接或间接更改数据库。
对于直接更改,由对话工作进程执行更新程序。
强制对话用户等待直到作任何输入之前更新操作已经完成为止。
在异步更新中,事务的对话部分与数据库的实际更新分离(例如,由于性能的原因)。
专门的更新工作进程执行数据库更新。
排队服务管理R/3系统中的内部锁定。
按照规则,关系型数据库系统的锁定机制不满足R/S的要求。
由不同工作进程处理对话步骤的事务甚至在切换时都必须保留赋予的锁定。
每个锁定不仅适用执行锁定事务的应用服务器,而且适用其它任何客户机/服务器配置。
因此,每个R/3系统只包含一个排队服务。
(关于逻辑锁定的详细信息,参见SAP锁定介绍(页5))。
2SAP系统中的事务
在通常意义下,事务是让用户更改数据库的操作。
该操作必须以“全部或没有”的方式执行。
如果事务运行成功,则应该执行所有的更改。
如果事务遇到错误,则不执行任何更改。
当在事务的中途发生错误时,应该取消该点前的任何数据库更改。
这将使数据库保留事务开始前的状态。
在SAP系统中,数据库级事务和作为程序员设计的事务之间有重要区别。
此区别(本节中说明)是用于执行数据库更新的绑定技术的动机。
事务和LUW
在SAP系统中,单词事务有几种意义:
_数据库事务(“LUW”或“数据库LUW”)
在数据库世界中,“全部或没有”事务称为LUW(工作逻辑单元)。
LUW是必须作为单元执行的所有更新请求的时间段。
在LUW结尾,系统或者提交对数据库的更新或者丢弃这些更新(丢弃更改称为“反转”)。
每次提交或反转既是一个LUW的结束又标志着下一个LUW的开始。
SAP系统在每次更改屏幕时自动触发数据库的提交操作。
这意味着数据库LUW最长维持从一个屏幕到下一个屏幕的更改。
_更新事务(“SAPLUW”)
事务是组成逻辑单元的业务相关任务。
该任务的执行需要几个SAP屏幕来实施,但是可以组成单个功能(例如,显示数据库、更改数据库或者发送消息)。
不是所有事务都涉及更新数据库。
但是在本章中,我们只讨论执行更新的事务(“更新事务”)。
作为逻辑单元,更新事务应该全部执行或根本不执行。
因此有时称它们为SAPLUW,以使其同数据库LUW区分开来。
一般地,更新事务通常跨越几个数据库LUW,并且在ABAP/4级使用COMMITWORK命令关闭。
(该命令执行几个任务,其间触发数据库执行)。
_ABAP/4事务(“SAP事务”)
ABAP/4事务是在单个事务代码下结合的业务相关任务集。
ABAP/4事务可能包括几个“更新事务”(如同以前所作的说明)。
作为程序,ABAP/4事务是包括模块存储、屏幕、菜单界面、事务代码等等的复杂对象。
3LUW和更新事务
“LUW”(工作逻辑单元)是数据库更新必须以“全部或没有”方式执行的时间段。
或者全部执行(提交),或者丢弃(返回)。
在ABAP/4系统中,LUW和事务可以有几个意义:
_LUW(或“数据库LUW”或“数据库事务”)
这是由数据库提交终止的更新集。
LUW最长从一个屏幕更改维持到另一个屏幕更改(因为SAP系统在每次屏幕更改时自动触发数据库的提交)。
_更新事务(或“SAPLUW”)
这是由ABAP/4提交终止的更新集。
SAPLUW的维持可以比数据库LUW的维持长得多,原因是大多数更新处理超过多重事务屏幕。
程序员通过发出COMMITWORK语句来终止更新事务。
3更新绑定介绍
用于绑定更新的ABAP/4技术使您可以编程超过几个屏幕的全部或没有的事务(逻辑LUW)。
只能在结尾时提交对这些事务的更改。
该事务有两个重要特征:
_可以避免每次屏幕更改时提交更新。
_可以锁定即将跨过多重屏幕予以更新的对象。
介绍主题是:
为什么更新绑定?
(页3)
绑定技术概要(页3)
不同工作进程中的更新(页4)
同步和异步更新(页4)
关于绑定更新的详细信息,参见:
更新编程技术(页5)
3为什么更新绑定?
SAP系统在每次屏幕更新和其它时间(每个CALLSCREEN、CALLDIALOG或CALLTRANSACTION语句,每个MESSAGE语句和每个远程函数调用)自动触发“数据库提交”。
这些数据库提交允许系统在屏幕间释放对话任务。
提交在系统内部发生,并且不受程序员影响。
无论何时出现运行时间错误或者程序发出错误消息(MESSAGE类型“A”),都会触发数据库反转。
一般地,可以将数据库LUW看作是跨越单个屏幕的所有处理。
但是编程的更新事务,通常跨越几个屏幕。
因此,不能依靠数据库提交结束更新。
如果已经这样做,那么,只要允许(在每次屏幕更改时)系统将提交更新,并且不能反转。
如果稍后发生错误,或者用户要取消此操作,那么,由于太迟将无法反转以前屏幕上所作的更新。
数据库锁定涉及相关问题。
系统自动创建并释放数据库锁定。
为每条更新语句创建数据库锁定并在每个数据库提交时予以释放。
然后在每次屏幕更改时释放数据库锁定,这意味着不提供对要锁定保护长于单个屏幕的对象的额外的访问。
要定址这些主题,SAP系统提供:
_在ABAP/4中的更新绑定技术
ABAP/4提供在特别更新例程中的绑定更新命令。
推迟执行这些例程直到程序发出显式的“SAP提交”。
SAP提交是触发数据库提交的ABAP/4语句(COMMITWORK),但也执行其它功能。
通过这些技术,可以在更新事务结束处执行更新,而不是在每次屏幕更新时。
_SAP锁定
系统允许在数据库对象上定义SAP锁定。
SAP锁定是SAP系统中的逻辑锁定,而不是自动应用的数据库锁定。
通过SAP锁定,可以锁定即将跨越多重屏幕予以更新的对象。
3绑定技术概要
通过更新绑定,可以将更新包装到只有当程序发出ABAP/4提交时才运行的特殊例程。
(或者,如果程序发出ABAP/4反转,则取消此执行)。
为此,请使用:
PERFORMONCOMMIT
CALLFUNCTIONINUPDATETASK
CALLFUNCTIONINBACKGROUNDTASK
这些语句指定不立即执行给定的FORM例程或者功能模块,而是在下次ABAP/4提交时执行。
ABAP/4提交是触发数据库提交的ABAP/4语句,同时也执行其它功能。
执行这些提交和反转的ABAP/4语句是:
COMMITWORK
ROLLBACKWORK
COMMITWORK和ROLLBACKWORK语句执行与任务同步执行相关的许多功能。
其中之一用于关闭更新事务,可以触发数据库提交或数据库反转。
如同LUW中的数据库提交(或反转),COMMITWORK和ROLLBACKWORK将“操作边界”(逻辑开始和结束)定义为全部或没有的更新集。
因此,在更新事务(页2)最后的LUW中使用这些语句。
使用ABAP/4绑定技术,可以根据需要定制更新过程。
介绍信息,参见:
不同工作进程中的更新(页4)
同步和异步更新(页4)
4不同工作进程中的更新
ABAP/4绑定技术可以将更新分配到不同的工作进程。
使用每个可能的技术,用COMMITWORK语句触发实际执行:
_在对话任务中的更新
PERFORMONCOMMIT语句在对话任务中调用表单例程,但是推迟其执行直到系统遇到下一条COMMITWORK语句为止。
由于COMMITWORK语句出现在更新事务的逻辑结束处,所以任何通过PERFORMONCOMMIT调用的表单例程中的更新语句都在更新事务(页2)中的最后LUW中运行。
详细信息,参见在对话任务中的绑定更新(页7)。
_更新任务中的更新
CALLFUNCTIONINUPDATETASK语句记录在更新任务中执行的功能模块。
后续的COMMITWORK语句触发实际执行。
在更新任务中运行的功能模块,有指定执行功能如何运行和何时运行的属性(“进程类型”字段)。
一些更新功能(称为“V1”功能)和相同进程类型的其它功能一起在单个更新事务(页2)中运行,并按请求顺序立即执行。
其它更新功能(称为“V2”功能)总在其单个更新事务中运行。
这些功能有推迟起点的“进程类型”,并且用于较少的关键请求。
详细信息,参见:
更新任务中的绑定更新(页8)。
_后台任务中的更新(远程主机)
CALLFUNCTIONINBACKGROUNDTASK语句记录在后台任务中运行的功能模块。
通常,该语句用于执行远程主机上的函数(通过指定附加参数DESTINATION)。
后面的COMMITWORK语句触发实际远程函数调用。
后台任务函数作为低优先级请求处理,但是相同目的地的所有请求在同一更新事务中运行。
详细信息,参见:
后台任务中的绑定更新(页11)。
关于RFC编程的详细信息,参见远程通讯(页Error!
Notavalidlink.)。
4同步和异步更新
“同步”和“异步”概念是等待概念的关键。
程序请求系统执行某一任务,然后或者等待或者不等待完成任务。
在同步处理中,程序等待:
只有任务完成之后控制才返回到程序。
而在异步处理中,程序不等待:
在记录执行请求之后系统返回控制。
在SAP数据库系统中,等待不能在请求语句(CALLFUNCTION或PERFORM)处发生,但可在COMMITWORK触发执行时发生。
同步更新在COMMITWORK语句完成时保证完成。
异步执行不保证完成。
SAP绑定技术允许两种处理:
_同步更新:
-通过PERFORMONCOMMIT调用FORM例程
-通过COMMITWORKANDWAIT触发更新任务功能模块
_异步更新:
-通过COMMITWORK触发更新任务功能模块
-通过COMMITWORK触发后台任务功能模块
详细信息,参见优化事务性能(页6)。
5SAP锁定介绍
要支持更新绑定计划,SAP系统提供了完全不同于数据库锁定的锁定机制。
SAP锁定的优点在于可以在多重屏幕间保留它们,如同更新事务(页2)所需要的。
数据库锁定是数据库系统中的物理锁定。
在程序中使用更新语句(SELECTSINGLEFORUPDATE、INSERT、UPDATE、MODIFY、DELETE)时,系统自动创建数据库锁定。
数据库锁定在每次数据库提交(即每次屏幕更改)时自动释放。
因此,数据库锁定对长于一个屏幕的锁定无效,并且作为程序员也无法控制。
SAP锁定是SAP系统定义的逻辑锁定。
要使用它们,首先定义指定要锁定数据库对象的锁定对象。
激活锁定对象时,系统生成所定义的每个锁定对象的锁定和解锁例程(称为ENQUEUE-
调用这些功能模块从ABAP/4程序中直接设置和释放锁定。
关于使用SAP锁定的详细信息,参见SAP系统中的锁定(页14)。
5更新编程技术
要在事务中实施数据库更新,参见下列主题:
维护数据库完整性(页5)
优化事务性能(页6)
未绑定的更新(页6)
在对话任务中的绑定更新(页7)
更新任务中的绑定更新(页8)
后台任务中的绑定更新(页11)
COMMITWORK处理(页12)
ROLLBACKWORK处理(页12)
后台处理考虑(页13)
绑定更新的错误处理(页14)
5维护数据库完整性
本节说明通过R/3系统保证数据完整性的形式,和必须在程序中保证的东西。
语义完整性
语义完整性描述数据的正确性和完整性。
尤其适用于包括几个步骤的更新操作。
必须执行所有相关步骤以保证语义的完整性。
一些数据库系统使用约束和触发技术来保证语义的完整性,但SAP数据库却并不如此。
用户必须:
_编程事务以便对操作作所有必须的检查
_发出COMMITWORK语句以使更改结束
关系完整性
关系完整性意味着坚持用于设计数据库的关系模型的规则。
所有SAP数据库都是关系型数据库。
通常,有三种类型的关系完整性:
_主码完整性
数据库中的每个对象必须由其主码唯一标识。
在ABAP/4词典中不可能创建没有主码的表格。
因此,整个R/3系统保证主码的完整性。
不必检查数据库数据的唯一性。
_值设置完整性和外来关键字完整性
在关系数据库中,没有字段能包含非该字段的允许值的值。
同样,表中的每个外来关键字必须参照关联检查表格中的主码。
许多数据库系统自动检查维护的这些条件。
但是SAP系统不这样做。
在编程事务时,必须牢记两级保护:
-从屏幕数据设置数据库值
可以在ABAP/4词典中指定字段的允许值集或外来关键字。
该词典使用这些信息请求联机用户输入有效屏幕值。
如果通过使用屏幕字段输入,程序更新数据库,则数据库保证有效。
-从非屏幕数据设置数据库值
使用非屏幕源中的数据,任何ABAP/4程序可以更新数据库。
这些数据不保证有效。
在这种情况下,编程所有必须的检查以保证数据库值的正确性是用户的责任。
操作完整性
操作完整性指避免多个用户同时更新相同的数据库对象。
这个问题的标准解决方案是每个用户锁定自己当前正使用的对象,以避免其它人访问。
SAP系统提供了SAP锁定,一种定义和将逻辑锁定应用于数据库对象的机制。
该机制比数据库系统提供的物理锁定更复杂。
要保证操作完整性,必须在事务中使用SAP锁定机制。
详细信息,参见SAP系统中的锁定(页14)。
6优化事务性能
访问数据库可能很费时。
事务访问数据库花的时间越多,用户的响应时间越长。
要优化性能,可以将部分事务工作分散给更新任务(或后台任务)处理。
选择异步处理
异步处理意味着可将更新分发给其它工作进程或应用服务器。
这通常可降低用户的响应时间。
应该将更新异步运行吗?
这实际上是折衷选择:
_任务结果
通过同步处理,当控制返回到请求程序时,保证完成处理请求。
程序需要完成更新以便继续处理吗?
如果是,则使用同步处理。
_响应时间
同步处理响应时间长:
用户必须等待已完成的更新。
如果不急于要求立即更新数据库,则使用异步更新。
但是,异步更新确实涉及某些开销。
记录更新任务请求时,系统进行两次额外数据库访问:
一次输入更新到日志文件,一次读出它们。
这些访问甚至不包括更新任务执行的实际更新。
一次输入更新到日志文件,一次读出它们。
这些访问甚至不包括更新任务执行的实际更新。
一般地,如果下列条件适用则异步更新有效:
_对话任务中的用户响应时间非常重要。
_响应时间有些重要,并且要求的更新如此复杂以至于超过记录请求的开销。
例如,在批处理工作进程中运行事务时,异步处理没有优点。
详细信息,参见后台处理考虑(页13)。
LUW处理:
哪些任务互相依赖?
一些更新请求相互依赖:
必须一起执行它们(或反转)。
其它请求可以完全独立运行。
必须决定更新是否需要作为逻辑单元一起运行。
如果需要,则应该或者在对话任务中一起运行,或者在更新任务中作为共同LUW请求运行。
对于更新任务更新,在设置更新任务功能模块的“进程类型”属性时指定如何处理请求。
“进程类型”决定是在共同的LUW中还是在单个LUW中运行更新请求。
详细信息,参见更新任务处理如何工作(页Error!
Notavalidlink.)。
更新优先级:
如何执行卸载任务?
异步更新请求可以立即运行或延迟。
立即开始更新是按其提交的顺序执行的共同LUW请求。
在独立的LUW中,延迟开始请求以后以任何顺序运行。
它们可能分发到不同工作进程。
进程类型属性(用于更新任务功能模块)决定是否立即或延迟运行更新任务请求。
其计时如何关键?
必须按请求的顺序运行吗?
详细信息,参见更新任务处理如何工作(页8)。
6未绑定的更新
在ABAP/4中不绑定也可以更新数据库。
但是在具体的更新时必须考虑SAP数据库环境的特殊方面。
下面两节列出一些选项。
但一般还是应该使用下面说明的绑定更新方法:
在对话任务中的绑定更新(页7)
更新任务中的绑定更新(页8)
后台任务中的绑定更新(页11)
行内更新
可以将更新语句(INSERT、UPDATE、MODIFY、DELETE)直接放置在代码中。
这些是“行内”更新(也就是非绑定的),无需使用任何ABAP/4绑定技术就可以执行。
即使没有编码COMMITWORK语句,下一屏幕更改的数据库提交也将更新提交给数据库。
此行内更新方法只适用于单个屏幕事务。
通过多屏幕事务,如果错误发生在以后的屏幕中,则不能反转早期屏幕提交的数据。
如果使用该方法,则不依靠屏幕更改时执行的自动提交。
SAP建议在屏幕处理之前显式地使用COMMITWORK。
缓冲行内更新
可能缓冲更改以便在更新事务结束时更新。
因为在提交处理期间未绑定执行,因此这些仍然是重要的行内缓冲。
但是,缓冲允许通过多屏幕收集更新,并且在完成时将其写入数据库。
例如,许多事务需要用户采取一系列步骤,在每个屏幕中一步,并且每步涉及分隔的表格更新。
当整个顺序成功运行之后则完成整个操作。
要执行简单行内更新,可以在给定屏幕上更新每个表格。
结果当然是:
如果在以后的屏幕中发生错误,则以前屏幕的更新不能反转。
要执行缓冲行内更新,可以在内部表(或其它存储)中保存每个屏幕的更改,直到该操作结束。
如果成功运行,则使用缓冲信息可以为每个表更新。
该技术类似于ABAP/4绑定,为以后执行要将更新保存在其中。
但是,一旦到达UPDATE语句(或