使用特殊的技术更新数据库(ABAP)

一,过程
1,DIALOG程序获得用户要更新的数据,并把它写到一个特殊的LOG TABLE,表内的条目属于同一个请求类型,包含了稍后将要写到数据库的数据。一个DIALOG程序可以写多条数据到LOG TABLE。写进LOG TABLE里的条目属于同一个LUW,意思就是它们要么都被执行,要么都不被执行。
2,DIALOG程序关闭LUW(将LOG TABLE的条目打包),并通知系统基本程序有一个包的数据需要更新。
3,系统基本程序从LOG TABLE读取这个LUW的需要更新的数据,并把这些数据提供给系统更新程序。
4,系统更新程序接受传输给它的数据,并更新数据库。
5,如果更新程序运行成功,系统基本程序删除这个LUW在LOG TABLE的所有数据;如果失败,保持LOG TABLE的这些数据,并标记不成功。触发更新程序的用户会收到系统发的关于这个错误的E-MAIL。可以用参数rdisp/vbmail(1发,0不发)来控制错误时是否发E-MAIL和rdisp/vb_mail_user_list($ACTUSER代表创建更新数据的用户)来控制错误时发E-MAIL给谁。可以用事务SM13来监控更新请求。
 
二,技术实现
更新程序必须用一个特殊的FM(update module)来实现。UPDATE MODULE和其他的FM一样,有传输参数的接口,但是只能有IMPORTING和TABLES,并且类型只能用参考或者结构。EXPORTING和EXCEPTION参数在UPDATE MODULE里是被忽略的。UPDATE MODULE里包含实际的数据库更新语句。
 
在DIALOG程序中,通过一个特别的FM,使用IN UPDATE TASK。如:
CALL FUNCTON 'F1' IN UPDATE TASK
     EXPORTING
        P1 = A
        P2 = B.
使用这样写法的FM不会立即执行,而是写进LOG TABLE,作为一个执行请求,一个SAP LUW下的更新请求存储在同一个UPDATE KEY下。对一个SAP LUW来说UPDATE KEY是一个唯一的世界范围的识别码,意思就是一个SAP LUW的UPDATE KEY是唯一的,不会和另外的SAP LUW的UPDATE KEY重复。
 
只有当程序执行到COMMIT WORK的时候,才会为这些请求创建一个抬头条目LOG HEADER,表示以上这些同样UPDATE KEY的属于同一个包,然后系统关闭这个LUW。当LOG HEADER创建以后,系统通知DISPATCHER有一个更新包已经准备好可以处理了。
 
有些时候,你可能需要丢弃当前SAP LUW的所有changes(比如结束TCODE),可以使用ROLLBACK WORK或者弹出一个A类型的MESSAGE,这两个语句都可以有以下的效果:
-删除写到该点之前的所有的change requests
-删除写到该点之前所有的锁
-丢弃当前DB LUW执行的changes
-丢弃所有使用POC形式登记的subroutines
 
ROLLBACK WORK语句不会影响程序上下文,意思就是,所有的数据对象保持不变。UPDATE MODULE里面不允许有显示的ROLLBACK WORK或者COMMIT WORK语句。
 
如果更新失败,属于这个SAP LUW的LOG条目会标记成不正确,同时错误消息也会保存到日志。可以用SM13来检查LOG条目。
 
如果在DIALOG程序里为更新技术设置了锁,并且锁的参数_scope = 2,那么使用COMMIT WORK之后锁会被传递到UPDATE TASK,这个时候在DIALOG程序中,锁不能被访问。
 
在UPDATE MODULE里不必显示的去释放锁,因为更新处理的最后阶段,系统会自动释放这些锁。当UPDATE TASK有错误发生的时候,也会自动释放锁。
 
如果UPDATE MODULE允许更新请求再次被处理,在处理的时候数据库中的数据表跟失败的时候可能不一样,而且也没有锁保护了,因为错误产生的时候,锁自动被释放了。
 
举个例子,如果一个凭证没有成功更新到数据库是因为数据库的表空间溢出,这个时候比较适合再次处理。
 
三,更新的模式
1,异步模式
在这个模式下,DIALOG程序和UPDATE程序各自运行。DIALOG程序写请求到LOG TABLE,用一个COMMIT WORK来关闭LUW。UPDATE程序被COMMIT触发并开始运行来处理这些请求,DIALOG程序继续运行,不会等待UPDATE程序结束。UPDATE程序在特殊的UPDATE WORK PROCESS中运行。
 
当数据库更新花费比较长的时间,用户DIALOG需要较少的响应时间,异步更新显得比较重要。在DIALOG处理中,异步更新是标准的技术,意思就是DIALOG程序一般会采取异步更新方式。
 
可以用VBLOG这个簇表来实现LOG TABLE,或者用透明表VBHDR,VBMOD,VBDATA,VBERROR来替代它。
 
2,同步模式
可以用COMMIT WORK AND WAIT语句来触发一个同步更新,DIALOG程序要等待UPDATE程序结束再进行下一步的处理。
 
如果后续处理或者DIALOG程序的结束需要依靠更新的结果,这个时候要用同步模式。可以用SY-SUBRC来检查同步更新的执行情况,在程序等待UPDATE程序执行的过程中,DIALOG程序的DIALOG WORK PROCESS被释放,当更新结束之后,系统重新为DIALOG程序分配一个新的空闲的DIALOG WORK PROCESS做下一步的处理。
 
3,本地模式
使用SET UPDATE TASK LOCAL语句来使用UPDATE MODULE在本地执行,同样的用COMMIT WORK来关闭SAP LUW,更新会在同一个DIALOG WORK PROCESS中进行,DIALOG程序等待更新完成(同步)。当LOCAL UPDATE完成之后,会提交一个显示的DB COMMIT,DIALOG程序也得以继续执行。
 
如果更新执行有错误,并且其中一个UPDATE MODULE发出一个终止程序的MESSAGE,系统会执行一个自动的DB ROLLBACK来丢弃这个SAP LUW所有的改变,并且DIALOG程序会终止,并弹出一个程序终止信息。
 
LOCAL UPDATE模式中,更新请求不会写到VBLOG表中,而是在MAIN MEMORY中,因为没有IO的访问,其速度要比同步和异步模式的快一点。LOCAL UPDATE只适合批量模式。
 
SET UPDATE TASK LOCAL工作到遇到COMMIT WORK语句,意思就是COMMIT WORK执行之后,SET UPDATE TASK LOCAL不再有效。
 
四,UPDATE MODULE的类型(V1&V2)
FUNCTION MODULE的processing type有三种,NORMAL FUCNTION MODULE,REMOTE-CAPABLE MODULE和UPDATE MODULE。每种下面又包含4种分类,立即启动,立即启动(不可重启),延迟启动,collective run.前2种属于V1类型,后两种属于V2类型。
 
UPDATE MODULE的类型决定了其处理的模式。所有的DIALOG程序里的V1请求都会在单独的DB LUW里执行。只有当V1执行成功之后才会处理V2请求,V2也会在单独的LUWS里执行。
 
V2类型的UPDATE MODULE处理的DB CHANGES一般都是紧接着V1的CHANGES(MAIN CHANGES)之后进行的。
 
V1类型的UPDATE MODULE分可重新启动或不可重新启动的两种。V2类型的当发生错误的时候总是可以重新启动,再次处理。
 
V2类型的COLLECTIVE RUN是SAP内部使用。相应的V2请求并不是在V1执行之后直接执行,而仅仅是在程序RSM13005被调用之后才执行。
 
V1请求都是由V1类型的UPDATE MODULE来创建的,对于同步异步模式来说,V1类型的UPDATE MODULE都会把请求创建到VBLOG这个TABLE,对于本地更新模式来说,V1请求是在MAIN MEMORY中创建的。V2类型的请求总是创建到VBLOG表中。
 
V1请求都会在一个V1类型的UPDATE WORK PROCESS(UPD)作为一个单独的DB LUW来处理。如果V1更新成功,系统会删除V1的请求和所有在V1更新任务上的锁,并设置一个DB COMMIT,然后触发V2更新。
 
V2请求也是在一个V2类型的UPDATE WORK PROCESS(UPD2)作为一个单独的DB LUW来处理。如果SAP系统没有设置V2类型的UPDATE WORK PROCESS,则V2请求会在一个V1类型的UPDATE WORK PROCESS里进行处理。如果V2请求处理成功,将会从VBLOG删除相关的请求,并设置一个DB COMMIT。V2请求一般都会运行在没有锁的情况下,因为这些锁在V1完成之后就被删除掉了。因此,V2更新总是运行在没有SAP LOCKS的情况下。
 
如果V1 UPDATE MODULE用一个终止消息终止了V1更新,那么V1更新任务上的锁讲被删除,数据库将ROLLBACK,一个E-MAIL会发送给创建这个LUW的用户,并且V1请求在VBLOG表中被标记为不正确。V2更新也就不会被触发。
 
当然如果V2 UPDATE MODULE终止了V2更新,同样的,数据库ROLLBACK,属于这个SAP LUW的V2更新都不会执行,V2请求在VBLOG表中被标记为不正确。
 
DIALOG程序用_SCOPE = 2创建的锁会被传递到V1更新任务中,在V1更新的结束,不管V1更新是否成功或者终止,都会把这些锁自动删除。因此,在DIALOG程序中不能显式的删除这些锁(太早),或者在UPDATE MODULE里删除(没必要)。

使用特殊的技术更新数据库(ABAP)相关推荐

  1. 深入理解分布式技术 - 先更新数据库,还是先更新缓存

    文章目录 Pre 数据不一致 更新缓存的方式 先更新数据库,再更新缓存 (数据库是新的,但缓存中数据是旧的) 先删缓存,再更新数据库 (并发操作下出现业务不一致) 先更新数据库,再删缓存 ( Cach ...

  2. C#——《C#语言程序设计》实验报告——数据库编程——基于ADO.NET技术的数据库操作DEMO

    一.实验目的 掌握ADO .NET数据离线与在线访问模型: 掌握应用LINQ进行数据查询: 二.实验内容 基于ADO.NET技术进行数据操作 已提供一个控制台程序的框架.附件中提供了各种格式的Nort ...

  3. 利用自定义分页技术提高数据库性能

    利用自定义分页技术提高数据库性能 孟宪会 2002-11-11 14:28:17 Web应用程序是显示数据库中数据的一个非常好的方法,通过它,你可以把业务复杂,并有访问和安全规则的数据库数据以一种简单 ...

  4. (数据库系统概论|王珊)第十章数据库恢复技术-第四、五、六、七节:数据库恢复技术和数据库镜像

    文章目录 一:数据库恢复的实现技术 (1)数据转储(备份) A:转储的分类 ①:按照系统是否运行事物时分类 ②:按转储的范围分类 (2)登记日志文件 A:日志文件的内容 B:日志文件的作用 C:登记日 ...

  5. mysql语句批量更新数据库_sql 更新批量数据库语句

    JDBC(六)批量处理sql 批量更新是分组在一起的一批更新,并以"批量"方式发送到数据库,而不是逐个发送更新. 一次发送一批更新到数据库,比一个一个发送更快,等待每个更新完成. ...

  6. 安卓学习之持久化技术(数据库操作)

    1.持久化技术简介 让数据在瞬时状态和持久化状态进行转换的机制. 主要包括文件存储.shareOreference存储以及数据库存储. 2.文件存储 1.将数据存储到文件中 Context 类中提供了 ...

  7. Microsoft Build 发布丨开发者关注的7大方向技术更新

    一年一度的 Microsoft Build 终于来了,带来了非常非常多的新技术和功能更新.不知道各位小伙伴有没有和我一样熬夜看了开幕式和五个核心主题的全过程呢?接下来我和大家来谈一下作为开发者最应关注 ...

  8. Micorsoft Build 2022 开发者最应关注的七大方向主要技术更新

    一年一度的 Microsoft Build 终于来了,带来了非常非常多的新技术和功能更新.不知道各位小伙伴有没有和我一样熬夜看了开幕式和五个核心主题的全过程呢?接下来我和大家来谈一下作为开发者最应关注 ...

  9. 非易失性内存技术及数据库

    非易失性内存技术及数据库 内容 "2013年开始这个项目的研究,当时不确定非易失性内存技术是否可商用.2019年Intel商用了NVM产品,NVM对下一代数据库系统的影响吸引了广大研究者&q ...

最新文章

  1. 思科3750开启策略路由功能
  2. mysql真的不能做搜索引擎吗?
  3. 安装 | MATLAB2020b软件及安装教程( WIN10 64位)及运行21个图像调试代码
  4. 802.11n兼容a/b/g问题(Legacy mode,Mixed mode,Greenfield mode)
  5. 【DevCloud · 敏捷智库】两种你必须了解的常见敏捷估算方法
  6. java mcv_Spring和SpringMCV配置
  7. OneNote中到底能放多少种东西?
  8. 2.11.PHP7.1 狐教程-【PHP 数组】
  9. 用.NET提供的Mail来发邮件
  10. 如何保证缓存与数据库的双写一致性
  11. myeclipse中tomcat热部署设置
  12. php分页类函数,php分页类的使用方法
  13. 计算机与代数---如何计算log---方法推理[1]
  14. 谁要的手机用KRKR2 Onscripter 资源打包工具
  15. HDU5713 K个联通块
  16. 用c++从头开始实现决策树
  17. 升级 MDK 5.37 后的问题处理: AC6编译选项, printf, 重启失效等
  18. vr全景三维产品交互展示设计
  19. android 截屏需要权限,安卓App要权限还会偷删截屏?专治流氓App神器
  20. 2019年,什么行业最赚钱?

热门文章

  1. 一逛淘宝就停不下来?秘密在于首屏设计...
  2. 【PMCAFF大咖分享会】揭秘大数据驱动下的京东供应链体系
  3. 【独家】去哪儿网PRD兵法秘籍大公开,火爆课程精彩直击!
  4. 【干货】从零开始做运营(超详细脑图)
  5. mac 下 通过 brew 安装 MariaDB
  6. 软考自查:数据库设计
  7. DeprecationWarning Mongoose mpromise (mongoose's default promise li
  8. Xamarin的播放音频和视频的媒体管理插件
  9. 《Java从入门到放弃》框架入门篇:hibernate基本用法
  10. 移动网络安全不容忽视 对恶意程序打好防范补丁