Hallo
DP ler
Ich würde mich über eine Einschätzung von euch zu folgendem Problem und meinen Lösungsweg freuen.
Problem:
Ich entwickle zur Zeit ein Dokumentenmanagementsystem dass eng mit unserer ERP Lösung zusammenarbeitet. Die Haupttabelle für dieses Projekt ist eine Tabelle wo jedes Dokument einmalig gespeichert ist. Durch folgende Vorgänge können neue Sätze in diese Tabelle erstellt werden.
1. Aus dem ERP System beim Druck diverser Belegarten
2. Über einen Dokumentencsanner der von meinem Programm angesprochen wird.
3. Von bis zu 100 Usern im Netzwerk durch diverse Ablagemöglichkeiten im Programm.
Ich halte es für nicht ausgeschlossen dass in dieser Konstellation es vorkommen kann dass zwei oder mehr Inserts zusammenstossen (Ich verwende einen Primary Key in dieser Tabelle für das ID Feld).
folgenden Code habe ich mir für die Lösung dieses Problems überlegt
Delphi-Quellcode:
while i < 50
do //50 gleichzeitige Zugriffe simulieren
begin
i:=i+1;
MaxInsVersuche:=0; olev:=0;
while (MaxInsVersuche < 5)
and (olev = 0)
do // Verhinderung Endlosschleife falls
// Exception durch anderen Grund ausgelöst
begin
Inc(MaxInsVersuche,1);
aNextDokId:=DataMain.NeueDokId;
// Holt nächste höhere Nummer (DokID) aus Datenbank
try
sSql := Format('
INSERT INTO dokumente (dkDokumentId, dkDokGruppe, dkErstelltAm, dkBezeichnung) VALUES (%s , %s, %s, %s)',
[IntToStr(aNextDokId),'
99',QuotedStr(DateToStr(now)),QuotedStr('
Bezeichnung')]);
DataMain.AdoConMain.ConnectionObject.Execute(sSql,olev,0);
except
Sleep(1000)
//Annahme Exception ausgelöst durch Verletzung Primary Key
// warten bis anderer User Insert abgeschlossen hat
end;
Memo1.Lines.Add(inttostr(aNextDokId)+'
@'+IntToStr(MaxInsVersuche));
end;
if olev<>1
then Application.MessageBox('
Insert nicht erfolgreich','
Fehler',16)
end;
ShowMessage('
Instert Ok');
Ich habe diesen Programmteil von 2 Pc's absolut gleichzeitig gestartet und es funktioniert
imho zielführend.
Anmerkung: Ich kann keinen Autowert oder
GUID für den eindeutigen Schlüssel verwenden.