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


[公式ヘルプ「_SCOPE パラメータ」](https://help.sap.com/doc/saphelp_nw70/7.0.12/ja-JP/23/edae617ba64e85bd4997f25c77eb1f/frameset.htm)を少し詳しく調べました。いつも忘れるので・・・
リンク先の↓の絵についてもう少し詳しくしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/c7593900-aefa-8a3c-5d21-d941bdd7633d.png)

# スコープによる違い
全部、「Dialog」と書いていますが、バックグラウンドでも当然同じですね。

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

### UPDATE TASKあり
Dialogと更新ワークプロセスで分けています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/5f6be809-c512-b818-78b5-1f7c6e6e3799.png)

### UPDATE TASKなし
UPDATE TASKがない場合はスコープ2でロックの委譲が起こらないのでダイアログワークプロセスでロックが解除されないのですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/c454a190-0c99-7eab-4369-7c07da2120b5.png)

## ROLLBACK時
UPDATE TASKがあった場合となかった場合の差異はなかったです。
**スコープ2はロールバック時にロック解除される**のが特徴的です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/b236f056-ab2c-88c5-5435-71a568e46553.png)


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

```abap: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.
```