Parallele Aufrufe verhindern?

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

Parallele Aufrufe verhindern?

Beitrag von cbe (ForumUser / 2 / 0 / 0 ) »
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 / 1230 / 26 / 301 ) »
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 ) »
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 / 3639 / 125 / 947 ) »
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

Re: Parallele Aufrufe verhindern?

Beitrag von Garfield (ForumUser / 5 / 0 / 0 ) »
Spät, aber immerhin...
Der Sperrmodus 'E' erlaubt es, dass der selbe User mehrfach die Sperre setzen kann. Daher denke ich, der Sperrmodus 'X' sollte der korrekte sein.

Seite 1 von 1

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und besseren Inhalt:

Aktuelle Forenbeiträge

JSON parsen in Node-Table
vor 12 Stunden von ralf.wenzel 3 / 49
Inlcudes in SapScripts
vor 15 Stunden von Tron 5 / 61

Vergleichbare Themen

Parallele Workprozesse
von Smeagol » 16.12.2005 11:02
System Aufrufe
von Drescher » 28.07.2003 11:44
Kurstyp - parallele Währung - Buchungskreiswährung
von Gast » 06.07.2005 19:19
parallele Hintergrundjobs mit gleichem Endezeitpunkt
von Timoniac » 20.10.2017 13:18
SAP Query: verschiedene parallele Zweige
von Skydizer » 08.05.2007 14:52