Parallele Aufrufe verhindern?

Alles Rund um SAP®.
4 Beiträge Seite 1 von 1
4 Beiträge Seite 1 von 1

Parallele Aufrufe verhindern?

Beitrag von cbe (ForumUser / 2 / 0 / 0 ) » 6. Jun 2019 14:35

Hallo,

ich habe ein Programm, das nicht parallel laufen darf. Wenn es parallel aufgerufen wird, soll es sich einfach beenden.

Ich habe es so gelöst, indem ich folgende Zeilen direkt am Anfang ausführe:

Code: Alles auswählen.

  "Einfach beenden, wenn das Programm schon bzw. noch in einem anderen Job läuft.
  CALL FUNCTION 'ENQUEUE_E_TLOCK'
    EXPORTING
      MODE_RSE_TLOCK       = 'E'
      PGMID                = 'LIMU'
      OBJECT               = 'REPS'
      OBJ_NAME             = sy-cprog
    EXCEPTIONS
      FOREIGN_LOCK         = 1
      SYSTEM_FAILURE       = 2
      OTHERS               = 3.
  CASE sy-subrc.
    WHEN 1.
      WRITE:  'Same job is already running - this instance is stopped.'.
      LEAVE PROGRAM.
    WHEN 2 OR 3.
      WRITE:  'Error in enqueue - this instance is stopped.'.
      LEAVE PROGRAM.
  ENDCASE.
aber das funktioniert nur meistens, aber nicht zuverlässig:
Z.B. werden 5 Jobs eventgesteuert zur gleichen Sekunde gestartet, 2 davon laufen parallel, 3 beenden sich wie gewünscht.

Evtl. liegt es daran, dass mehrere Server-Instanzen parallel laufen?
Vielleicht ist es auch etwas ganz anderes?

Kennt jemand dieses Problem? Und vor allem, wie man drum herumkommt?

Gruß,
Christian


Re: Parallele Aufrufe verhindern?

Beitrag von Tron (Top Expert / 1013 / 8 / 204 ) » 6. Jun 2019 17:34

Moin Christian.
Ich könnte mir vorstellen, dass z.B. bei einem Verbuchungsprozess das Programm zwar beendet ist, jedoch die Verbuchung noch nicht abgeschlossen ist, oder die Jobs so schnell parallel gestartet werden, das der ENQUEUE noch gar nicht so schnell registriert ist.

Code: Alles auswählen.

 "Einfach beenden, wenn das Programm schon bzw. noch in einem anderen Job läuft.
  CALL FUNCTION 'ENQUEUE_E_TLOCK'
    EXPORTING
      MODE_RSE_TLOCK       = 'E'
      PGMID                = 'LIMU'
      OBJECT               = 'REPS'
      OBJ_NAME             = sy-cprog
    EXCEPTIONS
      FOREIGN_LOCK         = 1
      SYSTEM_FAILURE       = 2
      OTHERS               = 3.
  CASE sy-subrc.
    WHEN 1.
      WRITE:  'Same job is already running - this instance is stopped.'.
      LEAVE PROGRAM.
    WHEN 2 OR 3.
      WRITE:  'Error in enqueue - this instance is stopped.'.
      LEAVE PROGRAM.
  ENDCASE.

* Wait Enqueu is active 
Do 10000 TIMES.
Call Function ENQUE_REPORT
       :
       :

if not number is initial.
      exit.
endif.
ENDDO.


Was macht denn Dein Programm sonst so ?

gruß Jens
PS.
Ich verwende als "Freies Sperrobjekt" gern ENQUEUE_E_TABLE
und zum Lesen aller gewünschten Sperren ENQUE_REPORT
<:: XING-Gruppe Tricktresor::>
Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen –
Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

Re: Parallele Aufrufe verhindern?

Beitrag von cbe (ForumUser / 2 / 0 / 0 ) » 6. Jun 2019 19:52

Ich möchte diesen Mechanismus in mehreren Programmen nutzen. Sie suchen z.B. zu einer BANF Daten zusammen und legen sie in einer Tabelle ab, oder aktualisieren Statusfelder. Aber vor allem sind es nicht meine sondern externe Programme, auf die ich wenig Einfluss habe.

Danke für den Tipp, ich werde mit enque_e_table ansehen. Hoffentlich zeigt der nicht dasselbe Problem, denn einen Sperrmechanismus, der nicht zuverlässig ist, kann ich nicht gebrauchen...

Re: Parallele Aufrufe verhindern?

Beitrag von a-dead-trousers (Top Expert / 3213 / 81 / 798 ) » 7. Jun 2019 08:16

Ich würde auf das SY-CPROG als Übeltäter tippen.
Versuch den ENQUEUE_E_TLOCK mal testweise mit einem statischen Reportnamen oder SY-REPID aufzurufen.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.07
Basis: 7.40

Seite 1 von 1

Aktuelle Forenbeiträge

Adobe LiveCycle Designer - Ausblenden Text auf letzter Seite
vor 41 Minuten von a-dead-trousers 2 / 35
ABAP Clean Code
vor 12 Stunden von ralf.wenzel 68 / 2198
Variable footer lines für line count
vor 16 Stunden von ewx 4 / 68
Quellcodeänderung mehrerer Programme
vor 16 Stunden von Ben2408 12 / 360
Formular 'HR_DE_BEA_AB_V03_MV' hochladen gelöst
vor 20 Stunden von Kerstin 4 / 92

Unbeantwortete Forenbeiträge

DOCVARIABLE in Worddokument setzen (OLE?)
vor 20 Stunden von msfox 1 / 25
BAPI_PO_CREATE1 und Einkaufsinfosatz
vor 2 Tagen von SweetRuedi 1 / 68
WCOCO: Gruppe für Betragsfelder 0S01
vor 4 Tagen von SAP_ENTWICKLER 1 / 44
CAS-Nr.: Chemical Abstracs Service
vor 6 Tagen von SAP_ENTWICKLER 1 / 81
Interaktives Skript, Rolle IC-Manager
vor 2 Wochen von erubadhron86 1 / 121