SAP LUW与数据库 LUW

1 LUW(逻辑工作单元概念)

       在SAP系统中,两个数据一致状态中的时间间隔为LUW(Logical Unit of Work),每一个LUW都需要以一个提交(COMMIT)或者返回(ROLLBACK)作为结束标志。如果已提交操作结束则进行所有更新操作,而返回操作则会取消所有数据库表的更改。

2 数据库LUW

       这是底层数据库自身提供的保持数据一致性的机制,与SAP系统无关,对于ABAP程序来说,主要的问题在于如何确定数据库的LUW触发时机,一个工作过程总是在下述情况下结束一个数据库LUW并隐式地进行数据库提交。

  • 当一个对话步骤(Dialog Step)结束,即显示一个新屏幕给用户时。
  • 在另一个工作过程继续程序的执行,这一般出现在 RFC 的调用或者返回过程中。

相应地,下列情况将使数据库隐式地进行返回操作。

  • 当前ABAP程序出现运行错误。
  • 一个ABAP程序因类型A或X的消息而导致中止。

3 SAP LUW

       SAP LUW是数据库 LUW的一个增强,受体系结构限制,SAP程序每次屏幕切换时(控制权从后台DIALOG进程转移到前台GUI的Session),都会触发一个隐式的数据库提交,一个程序在运行是会产生多个数据库的 LUW,这样无法做到全部提交或全部回滚,在某些业务场景下,这种事务的提交机制不足以保证数据的一致性,为此有有了 SAP LUW 机制。

       SAP LUW 是一种延迟执行的技术,它将本来需要执行的程序块记录下来。记录的位置在内存或DB Table中,如 PERFORM … ON COMMIT 会记录到内存中,Update Funciton module即可以记录到内存也可以记录到 VBMOD 和 VBDATA 表中.系统在执行COMMIT WORK的时候会查询记录,真正执行需要运行的代码,COMMIT WORK一般在最后一个屏幕执行,这样就实现了将跨屏幕的数据更新逻辑绑定到一个数据库 LUW中,实现复杂情况数据更新的一致性

       一个 SAP LUW 可以包含多个对话步骤,即多个数据库 LUW,但一个 OPEN SQL 语句不能被分隔为几个对话步骤,即通过 SAP LUW 可以将多个数据库 LUW 进行捆绑,并保存整体初始状态,不进行真正的数据库修改,当 SAP LUW 中的最后一个数据库 LUW 结束时,再进行整体修改,或者整体取消操作。

       SAP LUW提供以下具体数据库LUW捆绑机制。

3.1 CALL FUNCTION … IN UPDATE TASK

       在定义 FUNCTION 时将其定义为 Update module,同时在调用时使用 IN UPDATE TASK 参数,该模块不是马上被执行,而是被放置于应用服务器中的一个特殊的更新工作过程(Update Work Process)中,因此可以将多个分布在不同对话过程中的类似模块捆扎在一起,当 SAP LUW 结束时,确保所有模块同时被成功执行或整体放弃,因此可通过该方式封装分布在不同对话过程中的所有数据库更新操作。一个 SAP LUW 显式提交的方式是:COMMIT WORK [ AND WAIT ]。该语句结束SAP LUW 并触发更新工作过程,该过程在同一个数据库 LUW 中进行更新操作,因为数据库 LUW 此时可以替代SAP开始进行一致性控制。这些进行更新工作的 FUNCTION 可以被设为同步(加 AND WAIT)或异步执行,即是否要等到更新任务完成后才继续执行后续语句。
在这里插入图片描述
在程序调用 Update Module进行更新时分为本地方式和非本地方式

非本地方式:
       注册的更新函数记录在 VBMOD 和VBDATA 表中,COMMIT WORK 时更新操作在 UPDATE进程中执行,此时调用程序不等待被调用函数的返回,使用的为异步方式。如果使用COMMIT WORK AND WAIT,此时调用程序等待被调用函数的返回,使用的为同步方式。

本地方式:
       在调用函数前需要执行 SET UPDATE TASK LOCAL 。这样所有在该语句后使用 CALL FUNCTION … IN UPDATE TASK 注册的更新函数不会记录到数据库中,而是记录在内存中,在 COMMIT WORK 之后,会从内存取得待执行的函数,在同一个 Dialog 进程中执行数据的更新,本地方式更新采用的是同步方式,即使在 COMMIT WORK 后指定了AND WAIT 参数,仍然是同步执行。
       在使用 COMMIT WORK 之后 SET UPDATE TASK LOCAL的效果会被清除掉,如果COMMIT WORK 后注册的更新函数仍然需要采用本地方式,需要再执行一次 SET UPDATE TASK LOCAL语句。

优缺点对比:
       本地方式不将待执行的更新函数写到数据表中,减少了 I/O 操作,效率上较高,但由于采用的是同步方式,程序需等待更新结果,用户交互时的会感觉程序运行较慢。
       非本地方式会将更新结果记录到数据表中,可以通过SM13查看更新情况,同时由于可以进行异步更新,用户交互时感觉会比较快。

3.2 PERFORM … ON COMMIT [ LEVEL n ]

       效果与上面相同,此方法更高效,但是此时子过程不能传递参数。 LEVEL 表示优先级,n 取证书。n 越小越先执行。使用 ON COMMIT 参数注册的 Subroutine,如果同样名字的 Subroutine 被注册了多次,在 COMMIT WORK 时只执行一次,IN UPDATE TASK 方式执行的 Funciton 没有这个限制。

3.3 ROLLBACK WORK

       控制 SAP LUW 整体返回,在实现 SAP LUW 更新功能的 FUNCTION 或子程序内部不能使用此语句及 COMMIT 语句。

3.4 绑定方式的执行顺序

       PERFORM ON COMMIT 会优先执行,如果中断,CALL FUNCTION … IN BACKGROUND TASK 和 CALL FUNCTION … IN UPDATE TASK … DESTINATION 将不会执行,可以保证数据的全部提交和全部回滚。
       建议不要混合使用 CALL FUNCTION … IN BACKGROUND TASK 和 CALL FUNCTION … IN UPDATE TASK,因为一个是针对本地数据进行的更新,一个是远程数据,从技术上猜测,跨数据库的提交与回滚很难实现,故同时使用这两种方式可能会带来数据不一致的问题,除非本地和远程数据不需要保持数据的一致。

  • 8
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值