6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

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

スコープによる違い

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

COMMIT時

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

UPDATE TASKあり

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

UPDATE TASKなし

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

ROLLBACK時

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

実施プログラム

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

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.
6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?