8. Juni 2009 11:44
Hallo Allerseits,
für eine Schnittstelle soll ein XML-File generiert werden, dessen Name eine laufende Nr. enthält. Die Nummer wird aus einer Nummernserie gezogen über die Funktion InitSeries aus dem Nummernserien-Mgt. Die Datenbank läuft unter SQL-Server.
Im Prozess erscheint, ich nehme an, wenn das File-verarbeitende Programm aufgerufen wird, eine Microsoft Sicherheitsabfrag in der Richtung "Dieses XML-File haben sie noch nie zuvor geöffnet und es könnte ganz fürchterlich gefährlich sein und woollen sie es wirklich öffnen?".
Das Phänomen ist nun, daß, wenn vergessen wird, diese Meldung wegzuklicken, ein anderer User von einem anderen Rechner nicht ein neues Schnittstellen-File erzeugen kann, weil der erste Rechner noch die Hand auf dem Nummernserien-Datensatz hat, solange die Sicherheitsabfrage offen ist.
Nun ist es so, daß die gezogene Nummer auch in eine Protokoll-Tabelle eingetragen wird. Ich hatte nun vermutet, daß durch die Sicherheitsabfrage der Prozess im Navision so lange angehalten wird, bis die Abfrage weggeklickt wird, dann erst weiterläuft, zum Ende kommt und so dann erst automatisch das Commit an die Tabelle sendet und der Datensatz geschrieben wird. Bis dahin ist die Nummernserienzeile halt gesperrt.
Wenn dem so ist, sollte es doch möglich sein, vor Aufruf des XML-verarbeitenden Programms ein COMMIT auf die Protokoll-Tabelle abzusetzen, damit die Transaktion abgeschlossen ist und der nummerserien-Datensatz wieder frei ist - unabhängig davon, ob der Prozess nach hinten weiterläuft oder nicht - sonmit also auch unabhängig von der Sicherheitsabfrage.
Nun habe ich die Prozedur identifiziert, von der aus eine Unterfunktion aufgerufen wird, in der die Nummernserie für das File gezogen und in den Datensatz in der Protokolltabelle geschrieben wird. Nachdem diese Prozedur abgearbeitet ist, wird erst über den Hyperlink das weiterverarbeitende Programm aufgerufen.
Es erschien mir zweckmäßig, daß COMMIT ans Ende jener Prozedur zu setzen. Fazit: Der Nummernserien-Datensatz ist noch immer gesperrt, es kann durch einen anderen Prozess keine neue Nummer dieser Serie gezogen werden.
Nun setze ich das COMMIT nicht in jener Prozedur, sondern direkt in der darunterliegenden Funktion, die wirklicht das InitSeries aufruft und den erhaltenen Wert dem datensatz der Protokoll-Tabelle zuweist. Fazit: Jetzt funktioniert es.
Warum?
Schließt das COMMIT nicht auch Transaktionen ab, die in tieferen Ebenen begonnen wurden, als der Ebene, in der das COMMIT steht?
Viele Grüße,
SafetyFirst
9. Juni 2009 07:52
Hi,
SafetyFirst hat geschrieben:Schließt das COMMIT nicht auch Transaktionen ab, die in tieferen Ebenen begonnen wurden, als der Ebene, in der das COMMIT steht?
Das dachte ich eigentlich auch
Gruesse
feri