![]() |
Datenbank: MySQL • Version: 5.5.X • Zugriff über: UniDac
MySQL Duplicate Entry Auto-Inc
Hallo zusammen,
ich habe eine MySQL Tabelle mit einem Auto-Inc Primary Key. CREATE TABLE `AAA` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, ... ... PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=39378 DEFAULT CHARSET=utf8; Es gibt nur einen einzigen localen Client auf der DB. Dieser graift mittels UniDac auf die DB zu. Dieser Client empfängt Daten via Internet von diversen Sendern (mobile Geräte). Für jeden Empfänger wird ein Thread aufgebaut. Jeder Thread schreibt seine Daten in obige Tabelle. Es kommen 0-20 Sätze je Sekunde an. Das klappt auch soweit... ABER gelegentlich erhalte ich einen Primary Key Error (Duplicate Entry). MySQL hat dann tataäschlich den gleichen PKey 2 mal vergeben. Es scheint mir, als on MySQL mit den Therads nicht klar kommt bzw. mit der Masse der Sendungen. Aber 0-20 Sätze je Sekunden sind ja nun nicht wirklich viel. Leider weiß ich mir überhaupt keinen Rat mehr. In meinem Code kann ich einfach keinen BUG sehen oder finden. Hat jemand eine Idee ? Grüße |
AW: MySQL Duplicate Entry Auto-Inc
Kannst Du zeigen, wie Du die DB befüllst (SQL-Statement)?
|
AW: MySQL Duplicate Entry Auto-Inc
Ja... aber es ist aufgrund der Struktur der Klassen und Threads sicher nicht so sehr einfach lesbar bzw. verständlich.
Delphi-Quellcode:
function TSQLObjectRTTI.ComposeInsert(cl: TClass; idFieldName: String;
forceId: Boolean): String; var sep: String; fieldInfo: TFieldInfo; rttiType: TRttiType; props: TArray<TRttiProperty>; prop: TRttiProperty; fields, values: String; begin rttiType := GetTypeInfo(cl); fields := ''; values := ''; props := rttiType.GetProperties; for prop in props do begin if prop.Visibility = TMemberVisibility.mvPublished then if not IsBlob(prop.PropertyType) then begin if fields <> '' then sep := ' , '; if SameText(idFieldName, prop.Name) then begin if forceId then begin fields := fields + sep + '`' + prop.Name + '`'; values := values + sep + ':' + prop.Name; end; end else begin fields := fields + sep + '`' + prop.Name + '`'; values := values + sep + ':' + prop.Name; end; end; end; Result := Format('INSERT INTO %s (%s) VALUES (%s)', [ ClassToTableName(cl), fields, values ]); end; |
AW: MySQL Duplicate Entry Auto-Inc
Ist die 'id' in dem Statement enthalten?
Delphi-Quellcode:
Wenn ja, stelle sicher, dass dem nicht so ist.
Result := Format('INSERT INTO %s (%s) VALUES (%s)',[ClassToTableName(cl),fields,values]);
Weiß nicht, wie sich MySQL verhält, wenn man für ein Auto-Increment-Feld einen Wert liefert. Nimmt es auf jeden Fall einen eigenen neuen Wert oder übernimmt MySQL dann den "gelieferten" Wert? Wenn ich Deinen Quelltext richtig verstehe, sollte forceId auf jeden Fall false sein oder für die ID explizit Null geliefert werden. So in der Art:
Delphi-Quellcode:
if forceId then begin
fields := fields + sep + '`' + prop.Name + '`'; values := values + sep + 'Null'; end; |
AW: MySQL Duplicate Entry Auto-Inc
Hallo...
das Auto-INC Feld ist NICHT enthalten... es taucht im SQL String nicht auf. (wenn es enthalten ist und auch gefüllt, dann kommt MySQL nicht klar). |
AW: MySQL Duplicate Entry Auto-Inc
Wenn also sichergestellt ist, dass die ID nicht vomn Client geliefert wird, kann es nur ein datenbankseitiges Problem sein, eine Fehlersuche in Deinen Quellen dürfte sich damit erübrigen.
Schau mal bitte, ob Du hier weitere Infos findest: ![]() Es scheint jedenfalls häufiger ein ähnliches "Problem" zu geben. |
AW: MySQL Duplicate Entry Auto-Inc
> kann es nur ein datenbankseitiges Problem sein, eine Fehlersuche in Deinen Quellen dürfte sich damit erübrigen
Ja..... (leider sehe ich das auch so). Ich denke, schon, dass der Fehler im Code liegt.... Aber nicht so einfach. Im Kern streikt wohl MySQL (es muss aber irgendwie an der Benutzung von MySQL liegen.... und dann doch wieder am Code) |
AW: MySQL Duplicate Entry Auto-Inc
Zitat:
Vielleicht doch mit ID, ab und zu? Oder hast Du die konkreten SQL Statements vorliegen, wenn der Fehler zuschlägt? |
AW: MySQL Duplicate Entry Auto-Inc
Hat denn jeder Thread auch seine eigene Connection?
Wenn nicht, dann ist das auch kein Wunder mit der doppelten ID Vergabe. |
AW: MySQL Duplicate Entry Auto-Inc
Zitat:
ot ich würde sofort die DB wechseln, wenn es auch nur nach solchen Problemen riecht. Bei diesem System auch aus anderen Gründen. Kann seit einigen Jahren nicht mehr nachvollziehen, warum so häufig oder überhaupt mysql eingesetzt wird. /ot |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:49 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