ABAPのロックスコープの違い早見表


公式ヘルプ「_SCOPE パラメータ」を少し詳しく調べました。いつも忘れるので・・・
リンク先の↓の絵についてもう少し詳しくしています。

スコープによる違い

全部、「Dialog」と書いていますが、バックグラウンドでも当然同じですね。

COMMIT時

同期/非同期更新による違いはなし
local updateのパターンは未検証だが、おそらくUPDATE TASKなしと同じ。

UPDATE TASKあり

Dialogと更新ワークプロセスで分けています。

UPDATE TASKなし

UPDATE TASKがない場合はスコープ2でロックの委譲が起こらないのでダイアログワークプロセスでロックが解除されないのですね。

ROLLBACK時

UPDATE TASKがあった場合となかった場合の差異はなかったです。
スコープ2はロールバック時にロック解除されるのが特徴的です。

実施プログラム

ゴミのような汚いコードですが、参考まで。
↓のプログラムをコメントはずしたりしながら確かめました。更新汎用モジュールは何でもいいです。

report
REPORT y348221_test03_lockscope.

PARAMETERS:
  p_bp    TYPE bu_partner DEFAULT 'F0001',
  p_scope TYPE ddenqscope DEFAULT '2',
  p_wait  AS CHECKBOX.

START-OF-SELECTION.

  DELETE FROM y348221_test00.
  COMMIT WORK AND WAIT.

  PERFORM lock.
  PERFORM call_bapi.
  PERFORM update.


FORM lock.
  CALL FUNCTION 'ENQUEUE_E_BP000'
    EXPORTING
      partnr         = p_bp
*     X_PARTNR       = ' '
      _scope         = p_scope
*     _WAIT          = ' '
*     _COLLECT       = ' '
    EXCEPTIONS
      foreign_lock   = 1
      system_failure = 2
      OTHERS         = 3.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form CALL_BAPI
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM call_bapi .

  DATA:
    ls_central   TYPE bapibus1006_central,
    ls_central_x TYPE bapibus1006_central_x,
    lt_return    TYPE TABLE OF bapiret2.

  ls_central-searchterm1 = sy-uzeit.
  ls_central_x-searchterm1 = 'X'.

*  CALL FUNCTION 'BAPI_BUPA_CENTRAL_CHANGE'
*    EXPORTING
*      businesspartner = p_bp
*      centraldata     = ls_central
*      centraldata_x   = ls_central_x
*    TABLES
*      return          = lt_return.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form update
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM update .
  DATA:
    ls_insert TYPE y348221_test00,
    ls_return TYPE bapiret2.

  ls_insert-datum = sy-datum.
  ls_insert-uzeit = sy-uzeit.
  INSERT y348221_test00 FROM ls_insert.
*  CALL FUNCTION 'Y_348221_TEST00_00' IN UPDATE TASK.

*  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
*    EXPORTING
*      wait   = p_wait
*    IMPORTING
*      return = ls_return.
*
*  CHECK Ls_RETURN IS NOT INITIAL.
*  CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

  IF p_wait = abap_true.
    COMMIT WORK AND WAIT.
  ELSE.
    COMMIT WORK.
  ENDIF.
*  ROLLBACK WORK.
ENDFORM.