Einzelnen Beitrag anzeigen

Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#29

AW: Letzte vergebene Nummer speichern

  Alt 6. Aug 2022, 19:34
@BlueStarHH

Schau doch bitte mal, ob Du damit einen Ansatz bauen kannst: FireBird - Understanding the WITH LOCK clause
SQL-Code:
Syntax and behaviour

    SELECT ... FROM single_table
       [WHERE ...]
       [FOR UPDATE [OF ...]]
       [WITH LOCK]
Damit wird bis zum Commit eine Tabelle / ein Datensatz / eine Spalte gelockt. Andere können dann nicht schreiben, bekommen entweder eine Exception oder warten, bis die Freigabe erfolgt. Das kommt doch dann einer CriticalSection sehr nahe.

Dazu müsstest Du dann am Beginn der SP eine Tabelle / einen Datensatz / eine Spalte locken und zwar entsprechend für die Speicherung der jeweils letzten ID. Am Ende der SP schreibst Du dann die in der SP ermittelte ID entsprechend. Das anschließende Commit, egal aus ob aus der SP heraus oder aus dem aufrufenden Progamm, gibt den Datensatz bzw. Tabelle wieder frei, ebenso natürlich auch ein Rollback.

Für fachlich unterschiedliche IDs könnest Du dann eine Tabelle, mit nur einer Zeile, aber je ID einer Spalte, erstellen, per Select am Beginn der SP den Datensatz mit explizitem Lock auf die zu ändernde ID-Spalte lesen und am Ende genau die Spalte mit der ermittelten ID aktuallisieren.

Ohne auf korrekte Syntax zu achten als Idee:
SQL-Code:
procedure GetNextID
  SELECT LetzteIDSpalte FROM LetzteIDTabelle
  FOR UPDATE OF LetzteIDSpalte
  WITH LOCK;

  a := ErzeugePrefix;
 
  if Bedingung then
    b := gen_id(MeinGenerator, 1);
    UPDATE LetzteIDTabelle set LetzteIDSpalte = b;
  else
    b := '';

  c := ErzeugeSuffix;

  result := a+b+c;
end;
  Mit Zitat antworten Zitat