Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   MySQL Duplicate Entry Auto-Inc (https://www.delphipraxis.net/187741-mysql-duplicate-entry-auto-inc.html)

JRichmann 29. Dez 2015 14:58

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

borncrush 29. Dez 2015 15:05

AW: MySQL Duplicate Entry Auto-Inc
 
Kannst Du zeigen, wie Du die DB befüllst (SQL-Statement)?

JRichmann 29. Dez 2015 15:19

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;

nahpets 29. Dez 2015 16:31

AW: MySQL Duplicate Entry Auto-Inc
 
Ist die 'id' in dem Statement enthalten?
Delphi-Quellcode:
Result := Format('INSERT INTO %s (%s) VALUES (%s)',[ClassToTableName(cl),fields,values]);
Wenn ja, stelle sicher, dass dem nicht so ist.

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;

JRichmann 29. Dez 2015 16:36

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).

nahpets 29. Dez 2015 16:50

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: https://www.benefind.de/web.php?q=my...icate+Entry%22
Es scheint jedenfalls häufiger ein ähnliches "Problem" zu geben.

JRichmann 29. Dez 2015 18:55

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)

jobo 29. Dez 2015 19:09

AW: MySQL Duplicate Entry Auto-Inc
 
Zitat:

Zitat von JRichmann (Beitrag 1325518)
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).

Ich sehe jetzt an dem Code nicht, dass das ID Feld ausgeschlossen wird. Im Gegenteil, die "Props" werden dynamisch abgefragt und daraus das Statement gebaut.
Vielleicht doch mit ID, ab und zu?
Oder hast Du die konkreten SQL Statements vorliegen, wenn der Fehler zuschlägt?

Sir Rufo 29. Dez 2015 20:22

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.

jobo 30. Dez 2015 06:50

AW: MySQL Duplicate Entry Auto-Inc
 
Zitat:

Zitat von Sir Rufo (Beitrag 1325549)
Hat denn jeder Thread auch seine eigene Connection?

Wenn nicht, dann ist das auch kein Wunder mit der doppelten ID Vergabe.

Wenn die ID nicht mitgeschickt wird, sondern wirklich von der DB generiert wird, sollte das doch wohl piepegal sein, oder?

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 15:43 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz