[Erledigt] Eindeutige ID in Mehrbenutzerungebung
[Erledigt] Eindeutige ID in Mehrbenutzerungebung
Hallo alle Zusammen,
ich möchte mehrere Datensätze über eine TMsSqlConnection in eine MS-SQL-Datenbank schreiben,
welche alle eine gemeinsame ID haben sollten.
Eine Möglichkeit dazu wäre:
- letzte benutzte ID aus einer Tabelle auslesen
- ID inkrementieren und verarbeiten
- neuen Stand der ID in die Tabelle zurückschreiben
Problem dabei, genau in diesem Moment könnte eine andere Anwendung auch auf diese ID zugreifen und somit wäre die erhaltene nicht mehr eindeutig!
Ich habe versucht die Zeit zwischen Lesen und Zurückschreiben über eine Transaction zu sperren, bin aber leider bisher daran gescheitert.
Darum hier die Frage:
Hat jemand eine Tipp wie ich den gleichzeitigen Zugriff auf das Feld verhindern kann
oder gibt es vielleicht eine ganz andere Lösung für mein Problem?
Grüße eiko
ich möchte mehrere Datensätze über eine TMsSqlConnection in eine MS-SQL-Datenbank schreiben,
welche alle eine gemeinsame ID haben sollten.
Eine Möglichkeit dazu wäre:
- letzte benutzte ID aus einer Tabelle auslesen
- ID inkrementieren und verarbeiten
- neuen Stand der ID in die Tabelle zurückschreiben
Problem dabei, genau in diesem Moment könnte eine andere Anwendung auch auf diese ID zugreifen und somit wäre die erhaltene nicht mehr eindeutig!
Ich habe versucht die Zeit zwischen Lesen und Zurückschreiben über eine Transaction zu sperren, bin aber leider bisher daran gescheitert.
Darum hier die Frage:
Hat jemand eine Tipp wie ich den gleichzeitigen Zugriff auf das Feld verhindern kann
oder gibt es vielleicht eine ganz andere Lösung für mein Problem?
Grüße eiko
Zuletzt geändert von eiko am Mo 7. Jan 2019, 15:28, insgesamt 1-mal geändert.
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: Eindeutige ID in Mehrbenutzerungebung
Das muss gehen !eiko hat geschrieben:Ich habe versucht die Zeit zwischen Lesen und Zurückschreiben über eine Transaction zu sperren, bin aber leider bisher daran gescheitert.
-Michael
Re: Eindeutige ID in Mehrbenutzerungebung
Dachte ich auch,mschnell hat geschrieben:Das muss gehen !
aber irgendwie mach ich wohl noch was falsch.
Ein funktionierendes Beispiel wäre vermutlich hilfreich.
Grüße eiko
-
- Beiträge: 2118
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Eindeutige ID in Mehrbenutzerungebung
Warum verwendest du nicht einen automatisch inkrementierten Primary Key?
um die neue ID auszulesen hab ich das gefunden: Link. Führe beide queries auf einmal aus dann brauchst du dich nicht mal um das sperren zu kümmern (obwohl das die Transaktion eigentlich machen sollte, keine ahnung was du da falsch machst).
Ansonsten ist es oftmals eventuell auch nützlich einfach zufallsgenerierte ID's zu haben. Bei webanwendungen wird das gerne gemacht, sodass selbst wenn man eine sicherheitslücke haben sollte bei der man mit der ID an Nutzerdaten kommt, man nicht gezielt nach ID's suchen kann.
um die neue ID auszulesen hab ich das gefunden: Link. Führe beide queries auf einmal aus dann brauchst du dich nicht mal um das sperren zu kümmern (obwohl das die Transaktion eigentlich machen sollte, keine ahnung was du da falsch machst).
Ansonsten ist es oftmals eventuell auch nützlich einfach zufallsgenerierte ID's zu haben. Bei webanwendungen wird das gerne gemacht, sodass selbst wenn man eine sicherheitslücke haben sollte bei der man mit der ID an Nutzerdaten kommt, man nicht gezielt nach ID's suchen kann.
- af0815
- Lazarusforum e. V.
- Beiträge: 6766
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Eindeutige ID in Mehrbenutzerungebung
Selbst eine guid erzeugen und diese verwenden. Wie eindeutig muss der Key sein ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Beiträge: 2118
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Eindeutige ID in Mehrbenutzerungebung
Selbst wenn sie eindeutig sein muss, die Chance ist so niedrig das man bei einer langen guid eine Kollision hat, dass man das einfach über eine exception Bein insert handeln kann (vorausgesetzt die ID ist unique im sql definiert)af0815 hat geschrieben:Selbst eine guid erzeugen und diese verwenden. Wie eindeutig muss der Key sein ?
- af0815
- Lazarusforum e. V.
- Beiträge: 6766
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Eindeutige ID in Mehrbenutzerungebung
Der automatische inkr. PK ist nur Tabellen uique. Die Frage ist, muss der DB unique, Serverunique oder auch für Replikationen geeignet sein.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Beiträge: 2118
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Eindeutige ID in Mehrbenutzerungebung
Ja klar, aber mal ne ganz dumme Frage, wofür braucht man DB oder Server Unique ID's? Mir fällt grade kein Use Case dafür ein und hab sowas auch noch nie gesehenaf0815 hat geschrieben:Der automatische inkr. PK ist nur Tabellen uique. Die Frage ist, muss der DB unique, Serverunique oder auch für Replikationen geeignet sein.
- af0815
- Lazarusforum e. V.
- Beiträge: 6766
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Eindeutige ID in Mehrbenutzerungebung
Versuch mal eine DB bzw. Teile davon zu verteilen und auch über mehrer Standorte zu replizieren. Zusåtzlich noch ein paar Roadwarriordaten einzupflgen. Dann wird es langsam interessant.
Auch wenndu Daten auf verschiedenen Quellen zusammenführst und wieder trennst. Bsp. Filialen, die verteilt Buchen und von Zeit zu Zeit ihre Daten abgleichen.
Auch wenndu Daten auf verschiedenen Quellen zusammenführst und wieder trennst. Bsp. Filialen, die verteilt Buchen und von Zeit zu Zeit ihre Daten abgleichen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
Re: Eindeutige ID in Mehrbenutzerungebung
Erstmal Danke an alle fürs mitdenken!
Eine eindeutige ID für jeden einzelnen Datensatz lasse ich schon von der DB erzeugen,
das ist nicht das Problem.
Ich möchte aber noch mehrere Datensätze zu einer Gruppe zusammenfassen,
dies soll über eine gemeinsame Gruppen-ID geschehen.
Diese eindeutige Gruppen-ID zu erzeugen ist grad mein Problem!
Soweit ich weiß geht das nicht über die DB.
Die IDs müssen nur in dieser Tabelle eindeutig sein,
also nicht auf Serverebene oder gar weltweit.
Grüße eiko
Eine eindeutige ID für jeden einzelnen Datensatz lasse ich schon von der DB erzeugen,
das ist nicht das Problem.
Ich möchte aber noch mehrere Datensätze zu einer Gruppe zusammenfassen,
dies soll über eine gemeinsame Gruppen-ID geschehen.
Diese eindeutige Gruppen-ID zu erzeugen ist grad mein Problem!
Soweit ich weiß geht das nicht über die DB.
Die IDs müssen nur in dieser Tabelle eindeutig sein,
also nicht auf Serverebene oder gar weltweit.
Grüße eiko
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: Eindeutige ID in Mehrbenutzerungebung
Eindeutig zweideutig oder nur zweideutig eindeutig ?af0815 hat geschrieben:Wie eindeutig muss der Key sein ?
Also wie IPv6.
-Michael



- af0815
- Lazarusforum e. V.
- Beiträge: 6766
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Eindeutige ID in Mehrbenutzerungebung
Gedanklich nimm ganz einfach als ID den PK des ersten Datensatzes den du zu einer Gruppe formen willst. Damit ist das in der Tabelle eindeutig.eiko hat geschrieben:Ich möchte aber noch mehrere Datensätze zu einer Gruppe zusammenfassen,
dies soll über eine gemeinsame Gruppen-ID geschehen.
Diese eindeutige Gruppen-ID zu erzeugen ist grad mein Problem!
Code: Alles auswählen
Bsp:
PK Grp Info
01 01 Test1 gehört zu Gruppe 01
02 02 Test1 gehört zur Gruppe 2
03 02 Test1 gehört zur Gruppe 2
05 05 Test1 gehört zu keiner Gruppe, da sonst die ID nicht vorhanden ist
06 01 Test1 gehört zur Gruppe 1
07 07 Test1 gehört zur Gruppe 1
08 04 Test1 gehört zu keiner Gruppe, da sonst die ID nicht vorhanden ist, war aber früher in Gruppe 4
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Beiträge: 2118
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Eindeutige ID in Mehrbenutzerungebung
Das klassische verfahren hierfür ist die verwendung von Primary Keys und referenzen mit Foreigh Keys.
Kleines Beispiel für Nutzer und Nutzergruppen (bin nicht so gut mit SQL, daher nicht wundern über kleinere fehler)
Durch den Foreign key wird sicher gestellt das der wert der in dieser Spalte steht eine exsistierende ID aus Groups bzw. Users sein muss, durch den Primary Key in der UserGroups wird sichergestellt das jeder Eintrag (Nutzer, Gruppe) einmalig ist, außerdem falls man access level oder sowas in dieser DB noch speichert wird diese dazu nach diesem Tupel geindext (was suchen darauf schneller macht).
Kleines Beispiel für Nutzer und Nutzergruppen (bin nicht so gut mit SQL, daher nicht wundern über kleinere fehler)
Code: Alles auswählen
CREATE TABLE Users (
ID int NOT NULL AUTO_INCREMENT,
Name varchar(30) NOT NULL,
PRIMARY KEY (ID)
);
CREATE TABLE Groups(
ID int NOT NULL AUTO_INCREMENT,
Name varchar(30) NOT NULL,
PRIMARY KEY (ID)
);
CREATE TABLE UserGroups(
UserID int NOT NULL,
GroupID int NOT NULL,
// Andere daten, z.B. Berechtigungen
FOREIGN KEY(UserID) REFERENCES Users(ID),
FOREIGN KEY(GroupID ) REFERENCES Groups(ID),
CONSTRAINT PK_UG PRIMARY KEY (UserID ,GroupID)
);
Re: Eindeutige ID in Mehrbenutzerungebung
Erstmal Danke an alle fürs Mitdenken!
Ich hab das jetzt so wie von euch angeregt umgesetzt,
indem ich die ID des ersten Datensatzes auslese und diese dann als gemeinsames Kennzeichen weiterverwende!
Problem ist gelöst!
Danke eiko
Ich hab das jetzt so wie von euch angeregt umgesetzt,
indem ich die ID des ersten Datensatzes auslese und diese dann als gemeinsames Kennzeichen weiterverwende!
Problem ist gelöst!
Danke eiko