SAP ABAP openSQL数据库操作(一)
SAP ABAP openSQL数据库操作(二)
SAP ABAP openSQL数据库操作(三)
数据库的一致性和安全性的控制过程比较复杂.
多和客户服务器层次结构相关,abap中需了解LUM和锁定概念,从而对一致性和安全性有所了解.
比如我们常见的用户订单 商品库存 等是必须保持数据的一致性和安全性的,要不然很容易造成数据错误,造成严重的后果.
1.LUW概念
SAP系统采用luw概念及相关处理机制来保持应用数据在多个相关联数据表中数据的一致性.
两个数据一致状态中的时间间隔被称为luw.
每一个luw都需要以一个提交(commit)或者返回(rollback)作为标志,如果以提交做结束则进行所有的更新操作,而返回测试取消所有的数据操作.
要么全成功要么全失败.
2.数据库LUW
数据库luw是底层数据库自身所提供的把持数据一致性机制,与SAP系统无关.
在一个数据库luw之间,数据全部更新或者取消都是有数据库系统自动控制的.
对于abap程序来说,主要的问题在与如何确定数据库luw的触发时机,即何时数据库本身对所有数据进行提交或者返回操作.
尽管abap中有相关语句显示操作,然而SAP basis系统的应用程序运行过程中含有很多隐式的触发,如错误消息等.
一个工作 过程总是在下述情况下结束一个数据库luw并隐式地定性数据库提交:
1. 当一个对话步骤结束,即显示一个新屏幕给用户时;
2. 在另一个工作过程继续程序的执行,这种情况一般出现在rfc的调用或者是返回过程中
数据库隐含地进行返回操作:
1. 当abap程序出现运行时错误
2. 一个abap程序应为类型a或x的消息导致终止
3.SAP LUW
SAP系统中,数据库luw是不能确保数据的一致性的,因为每一个对话框步骤都会是一个数据库luw结束.
因为每一个用户行为都会触达一个pai事件而开始新的对话框和新的数据库luw,但在应用程序中,很可能出现的情况是用户通过多个行为才结束对所有数据库表的更新操作,直到用户点击保存按钮.
SAP luw 和数据库luw类似,SAPluw是abap应用程序的luw.
一个SAP luw 可以包含多个对话步骤,即多个数据库luw; 但一个openSQL语句不能分割几个对话步骤.也就是说,SAP luw 将多个数据库luw进行捆绑,并保持初始状态,不进行数据的修改,当SAP luw最后一个数据库luw结束时,再进行整体修改,或者取消.从而来保持数据的一致性.
总有一种感觉在数据一致性处理过程的方式有点类似于MQ
SAP luw 提供两种具体数据仓库luw捆绑机制,分别通过功能模块和子程序进行.
可以将功能模块在function bulider中定义为update module,对于这种更新模块,可以:
*函数调用实现
CALL FUNCTION ... IN UPDATE TASK.
*子程序实现
PERFORM ..ON COMMIT.
使用这个模块时,他会把所有的更新操作放置在一个应用服务器中的一个特殊的更新工作过程中,因此可以把不同的更新模块捆绑在一起,当SAP luw结束时 确保同时成功或失败.
SAP luw可以显示通过commit
语句提交:
COMMIT WORK.
ROLLBACK WORK.
因为SAP是多任务系统,在保持数据一致性机制中,除了luw外还需要数据锁定控制.
1.SAP 锁定
SAP luw 要求数据库对象的锁定在SAP luw结束后就释放,并让多有的SAP程序可见.
为了实现该目的,SAP basis系统提供一个逻辑数据锁定机制,该机制基于系统特定的所服务应用服务器中的中心锁定表.
SAP锁定,需要在se11
中进行创建一个锁对象.
REPORT z_enqueue_dequeue.
DATA: wa_sflight LIKE sflight.
wa_sflight-carrid = 'CA'.
*1.锁定
CALL FUNCTION 'ENQUEUE_EDEMOFLHT'
EXPORTING
mode_sflight = 'X'
* MODE_SBOOK = 'E'
* MANDT = SY-MANDT
carrid = wa_sflight-carrid
connid = wa_sflight-connid
fldate = wa_sflight-fldate
* BOOKID =
* X_CARRID = ' '
* X_CONNID = ' '
* X_FLDATE = ' '
* X_BOOKID = ' '
* _SCOPE = '2'
* _WAIT = ' '
* _COLLECT = ' '
EXCEPTIONS
foreign_lock = 1
system_failure = 2
OTHERS = 3.
IF sy-subrc <> 0.
* Implement suitable error handling here
MESSAGE id sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2.
ENDIF.
*2.数据更新
UPDATE sflight SET carrid = wa_sflight-carrid.
*3.解除锁定
CALL FUNCTION 'ENQUEUE_EDEMOFLHT'.
该程序中如果没有解除锁定,则知道程序结束,其他程序员才能对该表进行相同的操作.