ABAP-关于隐式与显式的DB Commit
转载:https://www.cnblogs.com/liaojunbo/archive/2011/07/11/2103491.html
1.显式的DB Commit
显式的DB Commit并没有对应的ABAP 语句来执行DB Commit,它是由平常的语句Commit Work来进行的.一个DB LUW中,我们是以该DB被打开,然后以DB Commit结束。
2.隐式的DB Commit
隐式的DB Commit更没有对应的ABAP语句来告诉系统(Okay,您给我偷偷模模做一下commit)。隐式的DB commit是由许多”未留意”的用户/系统操作所带来的附加影响,总结了一下,可以触发隐式DB Commit的操作主要有:
(1) When the system displays an SAP Screen
(2) When the system sends a dialog message(Okay: E,S, I; No:A,X)
(3) Whenever there are synchronous and asynchronous RFC calls
(4) With call transaction <tcode> or SUBMIT <program> statement
所以,从上面我当年范的错误中,也可以知道,如果我们不手动地为数据库操作语句加上commit work,当程序结束后(也就是会send msg或者selection screen等)会自动进行DB Commit;
同时,另外非常重要的一点就是,rollback只能在同一个DB LUW中进行操作,如果DB LUW被commit了,那么其将还原不了了。
同时,Debug会自动进行direct的DB LUW(注意,非update FM或perform <> on commit)的commit,所以,debug永远也就找不到答案了。
3. DB Commit与SAP LUW
正因为有了隐式的DB Commit,这时一个DB LUW结束了,同时该DB的物理锁被release了,所以,特别是在我们的Dynpro程序中我们需要定义SAP LUW,才需要了SAP Lock机制而不能依靠于DB Lock机制;
同时,我们知道,一个SAP LUW的结束是以commit work的ABAP语句为标志的,所以,这里就明白了,commit work在原理上将会带来如下的影响:
(1) 如果有打开的DB LUW,那么该DB LUW将会被结束
(2) 当前的SAP LUW将会被结束
另外,上面也已经提到,如果我们不是使用的direct的数据库更新技术,而是使用的如update FM或者perform <> On Commit这样的数据库更新技术,也就是说我们将数据库更新封装在一个SAP LUW中,这时上面的隐式的DB Commit是否会影响到这个SAP LUW中的数据库更新request呢?不会。
因为上面的隐式commit是针对DB Commit呢,而不是针对SAP Commit的。如果要执行上面SAP LUW中的数据库更新request,必须使用commit work这样的显式的DB/SAP Commit。
所以,这个时候就得注意了,特别是我们在程序中如果使用了Link program,也就是说牵涉到不同的session不同的program间的关系了,这时候,一定得保证,在前面program里的数据库更新请求是否被释放了(Commit)了,如果没有被commit,那么很遗憾,您的数据库更新就不会被执行了,这个时候虽然有隐式的DB commit,但并不起作用。
4. 测试实例
关于上面提到的那四类可以隐式的触发DB Commit的情形,以及在同一个DB LUW中的commit和rollback,我们可以创建很多自己的测试程序进行测试。
这里仅测试一下平常使用频率非常高的Update技术下的DB/SAP Commit.
该程序完成:
使用Perform <> On commit对数据库表的两条记录进行update。
分别测试了:
(1) 使用A msg:不发生隐式的DB Commit,也不会执行数据库更新request
(2) 使用X msg:不发生隐式的DB Commit,也不会执行数据库更新request
(3) 使用E msg:发生隐式的DB Commit,但不会执行数据库更新request
(4) 使用S msg:不发生隐式的DB Commit,跑到下面执行数据库更新request
(5) 使用I msg:发生隐式的DB Commit,返回后跑到下面继续、执行数据库更新request
(6) 使用Link Program:发生隐式的DB Commit,但不会执行数据库更新request(另外如leave to transaction也是类似)
*&———————————————————————*
*& Report ZTEST_COMMIT_1
*&
*&———————————————————————*
*& Commit
*& DB Commit & SAP Commit
*&———————————————————————* REPORT ZTEST_COMMIT_1 NO STANDARD PAGE HEADING. *— Data & Types
DATA:
gs_table1 type ZOFFERING_SOLUTI,
gs_table2 type ZOFFERING_SOLUTI,
gt_table type TABLE OF ZOFFERING_SOLUTI. START-OF-SELECTION. clear:gs_table1,gs_table2. *1. Modify the record 1
*1-1. Retrieve the data from table
clear:gs_table1.
SELECT single * from ZOFFERING_SOLUTI
into gs_table1
where SOLUTION_ID = ‘ZTEST_01′ AND
land = ‘DE’.
*1-2. Modify the description
gs_table1-text = ‘ZTEST_01 From Program ZTEST_COMMIT_1′.
*1-3. Using Update Subroutine
PERFORM frm_upd_table ON COMMIT. *2. Modify the record 2
*2-1. Retrieve the data from table
clear:gs_table2.
SELECT single * from ZOFFERING_SOLUTI
into gs_table2
where SOLUTION_ID = ‘ZTEST_02′ AND
land = ‘DE’.
*2-2. Modify the description
gs_table2-text = ‘ZTEST_02 From Program ZTEST_COMMIT_1′.
*2-3. Using Update Subroutine
PERFORM frm_upd_table ON COMMIT. IF = .
“ ”A type: No Update the DB(Interrupt the program)
“ MESSAGE ’Msg A will terminate the Execution of DB-Update’ type ’A’.
“ ”X type: No Update the DB(Interrupt the program)
“ MESSAGE ’Msg X will terminate the Execution of DB-Update’ type ’X’.
“ ”E type: No Update the DB(Interrupt the program)
“ MESSAGE ’Msg E will terminate the Execution of DB-Update’ type ’E’.
“ ”S type: Update the DB(Not Interrupt the program)
“ MESSAGE ’Msg S will not terminate the Execution of DB-Update’ type ’S’.
“ ”I type: Update the DB(Interrupt the program, but will go back then commit work!)
“ MESSAGE ’Msg I will not terminate the Execution of DB-Update’ type ’I’. “Leave to program(Will not execute the UPDATE-REQUEST by perfrom-on-commit)
Submit ZTEST_ALV_1 .
ENDIF. *3. DB Commit
COMMIT WORK.
IF sy-subrc = .
MESSAGE ‘Your Program executed Successfully!’ TYPE ‘S’.
ENDIF. *&———————————————————————*
*& Form FRM_UPD_TABLE
*&———————————————————————*
* Using Update Subroutine to Update the Table
*———————————————————————-*
FORM FRM_UPD_TABLE . * Modify the DB Table using Work area 1
IF gs_table1 is not INITIAL.
MODIFY ZOFFERING_SOLUTI from gs_table1.
IF sy-subrc <> .
MESSAGE ‘Your Modify is failed!’ type ‘A’.
ENDIF.
ENDIF. * Modify the DB Table using Work area 2
IF gs_table2 is not INITIAL.
MODIFY ZOFFERING_SOLUTI from gs_table2.
IF sy-subrc <> .
MESSAGE ‘Your Modify is failed!’ type ‘A’.
ENDIF.
ENDIF. ENDFORM. “ FRM_UPD_TABLE
另外,这里还必须说明一下:因为是on commit的执行,它并不像direct那样,做完了第一条的update后然后再去做第二条的update,它是在最后遇到commit work后才去执行,也就是说,如果不使用分别的gs_table1与gs_table2,相反例如只使用一个gs_table那么它只将更新最后一次得到的那个work area.
其实这也是On commit或update FM中最基本的。
ABAP-关于隐式与显式的DB Commit的更多相关文章
- android之intent显式,显式学习
intent,意图 当从一个Activity到另一个Activity时调用,这里重点学习显式,隐式的使用 使用语句上的区别: 隐式意图: 显式意图: setAction ...
- c# implicit explicit关键字(隐式和显式数据类型转换)
implicit关键字用于声明隐式的用户定义类型转换运算符.(explicit反之)explicit则用于显示转换用户自定义类型.static implicit operator target_typ ...
- IOS动画隐式,显式,翻页
// ViewController.m // IOS动画0817 // // Created by 张艳锋 on 15/8/17. // Copyright (c) 2015年 张艳锋. Al ...
- Windows提供了两种将DLL映像到进程地址空间的方法(隐式和显式)
调用DLL,首先需要将DLL文件映像到用户进程的地址空间中,然后才能进行函数调用,这个函数和进程内部一般函数的调用方法相同.Windows提供了两种将DLL映像到进程地址空间的方法: 1. 隐式的加载 ...
- 动态链接库的生成(dll)和 动态链接库隐式and显式调用
一.构建动态链接库(dll.dll dll.lib dll.h) 说明: .dll 是在执行程序是调用 .lib 是在连接程序是调用 .h是在编译程序时调用 1.头文件(声明导入函数):_decl ...
- C++ dll的隐式与显式调用
应用程序使用DLL可以采用两种方式:一种是隐式链接,另一种是显式链接.在使用DLL之前首先要知道DLL中函数的结构信息.Visual C++6.0(或者更先进的版本)在VC\bin目录下提供了一个名为 ...
- c# .net 关于接口实现方式:隐式实现/显式实现!
以前在用到接口时,从来没注意到接口分为隐式实现与显示实现.昨天在浏览博客时看到相关内容,现在根据自己的理解记录一下,方便日后碰到的时候温习温习. 通俗的来讲,“显示接口实现”就是使用接口名称作为方法 ...
- activity的隐式和显式启动
显式Intent(Explicit intent):通过指定Intent组件名称来实现的,它一般用在知道目标组件名称的前提下,一般是在相同的应用程序内部实现的. 隐式Intent(Implicit i ...
- 【java+selenium3】隐式等待+显式等待 (七)
一.隐式等待 -- implicitlyWait 调用方式:driver.manage().timeouts().implicitlyWait(long time, TimeUnit unit); / ...
随机推荐
- 我的nginx iis 负载均衡学习(环境搭建)
1,下载并安装nginx 比较简单 2,进行网站的配置 我使用了我的IIS 站点中已经拥有的两个站点 3,进行nginx 的配置 配置如下: 在server 节点之前添加如下的配置: upstream ...
- Open Flash Chart 之线图
天公司要求开发一个曲线图,简单看了一下之前公司的一个系统,发现一个曲线图效果还不错,查了一下叫OpenFlashChart,还是很不错的,很多人用.研究了一下,发现还不错,特地写了个DEMO测试下. ...
- Android之WebViewClient与WebChromeClient的区别
Android之WebViewClient与WebChromeClient的区别 2012-05-05 0个评论 收藏 我要投稿 ANDROID应用开发的时候可能会用到WE ...
- 几个有用的Linux命令
原文:http://spin.atomicobject.com/2013/09/09/5-unix-commands/ 本文为原文摘要. 1. man ascii 打印ascii代码表 2. cal ...
- 杂项:SQLite
ylbtech-杂项:SQLite SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中.它是D.RichardHipp建立的公有领域项目.它的设计目标是 ...
- 关于pycharm导入其他项目时出现找不到python无法运行的问题
之前拿到一个别的人用scrapy写的一个爬虫想运行看看,然后就出了类似于这种错误(类似的,这个是网上找的),一直提示找不到XXX路径下的python,然后无法运行执行文件... 我一看这个简单,这种就 ...
- [转]链接中 href='#' 和 href='###' 的区别以及优缺点
本文来自:http://c.jinhusns.com/bar/t-829 链接中 href='#' 和 href='###' 的区别以及优缺点 上一篇 下一篇近乎_问阳 发表于:2013-09-09 ...
- VBA 自动得到分数
' 将一个正数除以 y 返回一个整数或分数 Function RFs(ByVal x As Integer) As String Then RFs = Exit Function End If Dim ...
- Mysql 锁技术要点【转载】
MyISAM和InnoDB的区别 MySQL默认采用的是MyISAM. MyISAM不支持事务,而InnoDB支持.InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事 ...
- Redis等缓存数据库为什么访问会比较快?
首先,我们知道,mysql是持久化存储,存放在磁盘里面,检索的话,会涉及到一定的IO,为了解决这个瓶颈,于是出现了缓存,比如现在用的最多的 memcached(简称mc).首先,用户访问mc,如果未命 ...