同步、异步RFC过程中,每一个RFC调用在远程系统中构成一个独立的LUW,而事务性RFC调用可以将多个逻辑上相关的远程调用绑定至同一个LUW上。在该LUW内,按顺序调用,要么执行所有数据库操作,要么完全回滚来取消全部数据库更新操作,保证RFC调用过程的完整性和数据一致性。
事务性RFC调用处理保证在程序到达COMMIT WORK语句时执行所有计划的更新,并且事务性RFC调用仅运行一次,该调用具有安全、可靠的特点。
1.事务RFC调用语法
(1)7.0以前的事务RFC
语法:
(2)7.0以后的事务RFC
语法:
其中oref必须引用一个接口IF_BGRFC_UNIT实现类的对象(异常类捕捉CX_BGRFC_INVALID_UNIT),在相邻两个COMMIT WORK之间出现的所有相同目标的异步调用都属于同一个LUW。事务性RFC不需要等待每个单独的更新过程完成,调用程序就可以继续进行,直到事务结束,若调用发送时,远程系统不可用,调用将设为后台作业运行,不能从调用模块接收返回结果,不允许调用者进行与远程系统的交互性对话及测试。
不能直接或通过RECEIVE RESULTS FROM FUNCTION语句接收远程函数的返回结果,函数的接口不应指定任何EXPORT类型参数,否则在CALL FUNCTION语句中的IMPORTING参数将导致编译错误,事务性RFC运行的功能模块中不适合进行回调(调用远程目标BACK)。
2.事务RFC调用示例
在调用示例中直到COMMIT WORK语句才开始与远程系统进行联系,函数ZTEST_RFC是一个适合进行事务性RFC调用的远程函数模块,只进行远程系统中的数据库更新,不需要返回任何数据。
3.事务ID
每一个事务性RFC调用均通过一个独特的事务ID(Transactional ID,TID),TID存在于数据库表ARFCSSTATE和ARFCSDATA中,ARFCSSTATE记录LUW执行状态,ARFCSDATA包含事务性RFC调用的输入数据。
作业执行过程中,从事务性RFC表中读取相关数据,与相应的事务性RFC进行通信,远程LUW成功执行,则相应的条目在表中删除。因此,若LUW运行成功,则无法重新执行,因而保证了仅执行一次。
若COMMIT WORK同时触发了本地更新操作,则事务性RFC调用在本地更新成功完成之后才开始运行。
4.设定作业开始时间(www.daowen.com)
如果希望在特定时间启动LUW,可以通过函数模块START_OF_BACKGROUPTASK设置作业开始的时间,必须在LUW内部且在第一个CALL…IN BACKGROUNDTASK语句之后和COMMIT WORK语句之前调用该函数模块。
对于某个调用需要创建独立的事务,不参与其他目标的事务性RFC调用的任何一个LUW,可以通过AS SEPARATE UNTIAL附加项实现,各个LUW处理都是独立进行的,执行次序无法被保证。
5.出错处理机制
发生错误时,事务性RFC调用将启动重试机制或者回滚。通过COMMIT WORK执行远程调用时,不能建立到目标系统的连接,将在ARFCSSTATE表中记录当前状态,系统通过报表RSARFCSE根据当前的TID重新计划后台作业,准备进行下一次调用。默认时间间隔为15分钟,尝试至30次为止。
在RFC配置时(事物代码SM59),通过以下路径进行尝试次数和时间间隔的设定如图3-145所示。
图3-145
设定界面如图3-146所示。
图3-146
若经过最大尝试次数,仍然无法连接,系统将停止调用报表RSARFCSE,并将ARFCSDATA并状态更新为CPICERR,默认为8天,将表中的响应条目删除,事物SM59可以手动启动该条目。
执行出错时,A类型的消息或者RAISE语句抛出异常,则ARFCSSTATE表将记录出错状态,整个RFC中的操作将取消,SM58查看该错误并修改错误后,通过SM58重新启动出错的远程调用函数。
在远程调用函数中,功能模块RESTART_OF_BACKGROUNDTASK启动重试功能。
6.检查事务性RFC调用状态
每个LUW都用唯一的TID进行标识,有以下两种方法检查TID状态:
■ABAP程序:在CALL…IN BACKGROUND TASK之后和COMMIT WORK之前调用函数“ID_OF_BACKGROUNDTASK”,获得TID后,用FM“STATUS_OF_BACKGROUNDTASK”确定事务性RFC的状态。
■联机确认:通过SM58显示并维护事务性RFC的LUW状态。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。