![]() |
AW: Eigenartiger Effekt mit int-Primary Keys ?
Zitat:
@gmc616 Hast Du auch den richtigen Code statt den Pseudocode? Der Isolationlevel kann ein Problem sein, wenn auch nicht commitete Werte gelesen werden. Was passiert, wenn Du eine AdoQuery auf ein neues Formular setzt und genau diese Statements ausführst? Wie alt/neu sind Deine ADO Treiber und die der Kunden? Was geschieht mit Werten, die über diese problematischen Werte hinausgehen? |
AW: Eigenartiger Effekt mit int-Primary Keys ?
Dem schließe ich mich an :thumb::kiss: (Letzteres ist rein platonisch gemeint, nicht dass da jemand falsche Schlüsse zieht).
|
AW: Eigenartiger Effekt mit int-Primary Keys ?
Zitat:
Oder wollen wir uns doch mal treffen DeddyH? :stupid: |
AW: Eigenartiger Effekt mit int-Primary Keys ?
Ups. Mein Fehler - der Beitrag von DeddyH hätte mit abgetrennt werden müssen.
Sorry dafür. :oops: |
AW: Eigenartiger Effekt mit int-Primary Keys ?
Kein Problem meinetwegen, ist schließlich Karneval. Ich weiß natürlich nicht wie DeddyH das sieht.
:) @Abtrennung: Hab ich nun auch endlich geschnallt, dass das Thema "Umgang" verlagert wurde. ![]() |
AW: Eigenartiger Effekt mit int-Primary Keys ?
Zitat:
Gibt es Installationen mit diesen Datenbanken, bei denen
Single-User-Betrieb oder Multi-User-Betrieb? Um besser Hilfestellung geben zu können, wäre es eventuell hilfreich, wenn Du uns eine Liste der genutzten Datenbanken geben könntest. Für eine Problemlösung für unterschiedliche Datenbanken muss letztlich SQL-technisch der kleinste gemeinsame Nenner genutzt werden, um Dein Programm kompatibel zu allen genutzten Datenbanken zu halten. *** Gehen wir nochmal von Deinem Code aus:Aktuell sei ID = 5366037
Code:
Dann liefert das Select für ID den Wert 5366038.
// PseudoCode
TAdoCon.BeginTrans; UPDATE nidents SET id=id+1 WHERE tbname=:TableName AND idname=:PkName; SELECT id from nidents where tbname=:TableName AND idname=:PkName; TAdoCon.CommitTrans; Der Satz wird nun gelöscht:
Code:
ID ist nun -5366038.
UPDATE tabelle SET id=ABS(id)*-1 WHERE id=5366038;
Würde vom MSSQL-Server ausgeführt
Code:
so wäre ID weiterhin 5366038, dem Satz fehlt in diesem Fall nur die Löschmarkierung.
UPDATE tabelle SET id=ABS(id)*-1 WHERE id =NULL;
Eine ID-Dublette kann hier daher nicht entstanden sein. Eine ID-Dublette kann nur dann entstehen, wenn obiger "PseudoCode" zweimal das gleiche Ergebnis liefert. Da nicht bekannt ist, wie der tatsächliche Programmablauf erfolgt, könnte hier aber ein Problem vorliegen. Wenn mehrere Benutzer (und / oder mehrere Threads) gleichzeitig diesen Code ausführen, kann es zu Dubletten kommen. Beim Lesen der ID per Select ist der mit Update gesetzte Wert noch nicht in der Datenbank festgeschrieben, theoretisch könnte ein zweiter User annähernd zeitgleich daher zum gleichen Ergebnis kommen. Meiner Meinung nach wäre es sinnvoller, zuerst die ID in einer eigenen Transaktion in der Tabelle nidents zu erhöhen und erst nach dem Commit per SQL auszulesen, aber 100% sicher erscheint mir diese Lösung auch nicht.
Code:
Irritierend finde ich allerdings schon, dass der Fehler nur bei zwei Datenbanktypen mit zwei bestimmten IDs aufgetreten ist.
// PseudoCode
TAdoCon.BeginTrans; UPDATE nidents SET id=id+1 WHERE tbname=:TableName AND idname=:PkName; TAdoCon.CommitTrans; SELECT id from nidents where tbname=:TableName AND idname=:PkName; |
AW: Eigenartiger Effekt mit int-Primary Keys ?
Zitat:
(vor vielen Jahren war es Zeichen besonders cleveren Programmierens 16Bit-Words zu nutzen, die gehen ja bis 65.000 und soooviele Datensätze haben wir nieeee. Abgesehen von der etwas kurzsichtigen Sichtweise was die Datenmenge angeht, was passiert wenn auf diesen 16Bit-Wert mal als Word und mal als Integer zugegriffen wird??) Gruß K-H |
AW: Eigenartiger Effekt mit int-Primary Keys ?
Bei 20 Installationen ist das kein Zufall mehr. Es scheint doch so zu sein, das es bei allen Installationen auffällt. Ich tippe ja auch auf die Software selbst, aber das muss schon ein merkwürdiger Zufall sein.
Code:
Gemein ist das in jedem Fall.
Update Tabelle set Id=5366038 where ....
|
AW: Eigenartiger Effekt mit int-Primary Keys ?
Zitat:
ein
Code:
ginge ja zur not noch aber ein Update auf einen Datensatz der keinen Schlüssel hat??
Insert into Tabelle (id) values(12345)
Gruß K-H |
AW: Eigenartiger Effekt mit int-Primary Keys ?
Nein, ich meine 'irgendetwas Gemeines'. Also etwas, das richtig fies ist. Gemein. Unerwartet. Zum-Hand-Gegen-die-Stirn-klatschen. Oder-Kopf-gegen-die-Mauer.
PS: Die Tabelle hat ja einen Schlüssel. Das 'Statement' (das es so ja bestimmt nicht gibt) kann ja anders aussehen, z.B.
Delphi-Quellcode:
Anders kann ich mir das nicht erklären. Oder er überschreibt Field.SetText. Oder. Oder. Oder.
//Anstatt
Datensatz.Zahlenfeld := 5366038; // Steht da eben Datensatz.Id := BloedeFunktionDie5366038Ergibt(); Datensatz.Post; Ärgerlich, sowas. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz