1. COMMIT WORK 语句执行许多与任务的同步执行有关的功能。
ROLLBACK WORK语句“取消”任务同步执行的全部请求。
COMMIT WORK 语句进行下列处理:
• 执行全部由PERFORM ON COMMIT 请求的FORM 例程。
按优先级的升序执行这些例程,顺序由 PERFORM 语句的LEVEL 参数指定。
• 若是请求,触发全部更新任务功能模块。
• 若是请求,触发全部后台任务功能模块。
• 触发数据库提交(依次释放数据库锁定)。
• 清空反转日志。
反转日志包含应用更改前的表格快照。执行反转时,该快照用来将表格复位到原值。
• 关闭全部打开的数据库光标。
• 将全部TEMSE 对象写入永久性文件或数据库。
TEMSE文件是因为性能缘由在执行事务期间缓存的临时序列文件。TEMSE文件的示例有假脱机对象或做业日志。
• 将时间片计数器(用于访问工做进程)复位到0。
系统中的时间片计数器限制工做进程中程序运行的时间量。若是程序经常超过期间片限制,则能够使用COMMIT WORK为程序得到更多时间。
可是,要达此目的,必须很容易将处理分为更小单元(所有或没有操做)。而后能够在每一个单元以后插入COMMIT WORK 语句。固然处理单元逻辑上必须独立,由于在发生错误时,不能取消前面的单元中所提交的更新。
ROLLBACK WORK“抛弃”当前事务的全部更新:
• 抛弃全部之前用PERFORM ON COMMIT 登陆的FORM例程
• 在更新任务队列中将全部之前请求的更新任务功能标记为错误
• 抛弃全部之前请求的后台任务功能
• 从缓冲存储中删除全部TEMSE对象(临时 连续文件,如假脱机对象和做业日志)
• 触发数据库反转操做(依次释放全部数据库锁定)
• 关闭全部打开的数据库光标
2. 如下状况需使用使用COMMIT和ROLLBACK语句。
1) 经过INSERT、UPDATE和MODIFY语句对数据库进行更新事务后。
2) 执行BAPI处理后。通常使用BAPI函数BAPI_TRANSACTION_COMMIT(内含COMMIT语句) 。
3. 若是要保证数据库中当前所做的更改当即被确认,那么就必须使用COMMIT WORK 语句结束LUW。
COMMIT WORK 在程序代码中标记了 LUW(几个做业联系在一块儿造成做业的逻辑单元) 结束并启动更新任务。在COMMIT WORK 语句之后,对数据库所做的全部更改都不能再取消。可是,若是在LUW 中出现了错误,就必须取消已经执行的部分。这意味着当前没有任何插入的行能永久地保存在数据库中。要撤销当前LUW 对数据库的更改,请使用ROLLBACK WORK,它将取消前一次数据库提交后的全部更改。
4. COMMIT WORK [AND WAIT(同步)].
若是使用AND WAIT选项,那么在程序继续执行之前,它要等到更新任务的结束。若是更新是成功的,SY-SUBRC 就设置为0。若是 SY-SUBRC 返回一个非零值,就没有成功的存储所做的更改。
ROLLBACK WORK.
若是对更改的取消是成功的,SY-SUBRC 就设置为0。若是 SY-SUBRC 返回一个非零值,就没有成功地取消所做的更改
5. COMMIT WORK 和 COMMIT WORK AND WAIT 区别
首先说明一点:更新是异步的,更新是由SAP中UPD1和UPD2两个进程执行的,关于这两个进程各负责什么再说明一下
UPD1先执行,主要是用于数据库表的更新,好比说写表
UPD2后执行,主要是用于一些数据的收集统计等的更新,好比说为BW收集一下数据等等
同时这个是能够在SM13看到的,若是看到日志中UPD1成功,UPD2失败,若有BW的取数,那确定会丢数据的。
因此说COMMIT WORK是异步的,为了使其同步,全部就有了COMMIT WORK AND WAIT.
对于COMMIT WORK AND WAIT 来讲,是能够判断是否更新成功的,SY-SUBRC NE 0就是有问题的。
上面是最简单的区别,再有:
因为系统中COMMIT WORK的数量是有限的,好比说咱们系统是4000个,同时只能提交4000个更新进程,对于COMMIT WORK来讲,执行完就释放了,能够为后面的COMMIT WLRK继续使用;而对于COMMIT WORK AND WAIT是要执行完才释放的,因此对于没有必要同步更新的,也尽快使用异步,使得资源获得释放。