Einzelnen Beitrag anzeigen

Benutzerbild von IBExpert
IBExpert

Registriert seit: 15. Mär 2005
672 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Firebird 3.0 in einer SP (Multiuser-Umfeld) ein Wert ändern

  Alt 9. Mai 2022, 08:38
So als Konzept wie man das verhindern kann, wenn man das unter High Load realisieren muss:

1. Erstelle dir eine Tabelle mit chargennummer auf reserve (als zB sind da die nächsten x tausend verfügbaren chargennummer schon drin). Diese hat dann zB ein timestamp, wann die vergeben wurde
2. Wenn du eine Chargenummer brauchst, dann sucht deine prozedur über folgende weg eine heraus
3. übergeordnete sp ohne exception handling when any GetCharge
-diese ruft mit einer for select schleife alle chargen ab, die im vergeben timestamp null hat
4. über eine extra sp mit exception handling when any machst du das den eintrag
create procedure SetCharge(chargenr integer)
returns (res char(1))
as
begin
update charge set charge.vergeben=current_timestamp where charge.chargenr=:chargenr;
res='T';
when any do res='F';
end;
5. mit allen results die du in der GetCharge in der for select into schleife free chargenumer geholt hast machst du ein execute procedure SetCharge RETURNING_VALUES mit der chargenr als input sol lange bis die irgendwann man T zurück gibt, dann reicht ein break um deine for select schleife zu beenden, der timestamp ist für diese bisher frei charge gesetzt und egal ob unter high load jemand anders diese oder andere in lang laufenden transaktion auch setzt und evtl sogar rollback macht ist egal, weil keiner dadurch einen deadlock bekommt.

der code da oben ist einfach so runtergetippt, daher sicherlich hier und da evtl fehlerhaft, sollte aber zu schaffen sein, das umzusetzen
Holger Klemt
www.ibexpert.com - IBExpert GmbH
Oldenburger Str 233 - 26203 Wardenburg - Germany
IBExpert and Firebird Power Workshops jederzeit auch als Firmenschulung

Geändert von IBExpert ( 9. Mai 2022 um 08:54 Uhr)
  Mit Zitat antworten Zitat