从一次数据丢失事故复盘:深入理解SAP ABAP的COMMIT、ROLLBACK与LUW
那天凌晨三点,我被一阵急促的电话铃声惊醒。电话那头是运维同事焦急的声音:"销售订单数据出现严重不一致,客户投诉昨晚提交的订单在系统中消失了!"我立刻意识到,这可能又是一起典型的COMMIT WORK误用导致的数据丢失事故。作为SAP ABAP开发者,我们每天都在与数据库事务打交道,但真正理解COMMIT WORK、ROLLBACK WORK和逻辑工作单元(LUW)原理的人却不多。这次事故,让我们付出了惨痛的代价,也让我深刻认识到事务控制的重要性。
1. 事故现场:一个销售订单的"离奇消失"
我们的系统处理着一个跨国企业的全球销售订单,每晚需要处理数万笔交易。事故发生在月末高峰时段,业务流程大致如下:
- 用户在前台创建销售订单(VA01)
- 系统生成订单主数据(VBAK)
- 创建项目数据(VBAP)
- 更新库存信息(MARD)
- 生成财务凭证(BKPF)
abap复制DATA: lv_order TYPE vbeln,
lv_item TYPE posnr.
" 创建订单头
CALL FUNCTION 'BAPI_SALESORDER_CREATEFROMDAT2'
EXPORTING
order_header_in = ls_header
IMPORTING
salesdocument = lv_order.
" 循环创建订单行项目
LOOP AT lt_items INTO ls_item.
ls_item-itm_number = sy-tabix.
CALL FUNCTION 'BAPI_SALESORDER_CREATEFROMDAT2'
EXPORTING
order_item_in = ls_item
IMPORTING
salesdocument = lv_order
salesdocumentitem = lv_item.
" 错误示例:在循环内提交
COMMIT WORK. " 致命错误!
ENDLOOP.
问题就出在那个循环内的COMMIT WORK。当系统处理到第1
