AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken MySQL Duplicate Entry Auto-Inc
Thema durchsuchen
Ansicht
Themen-Optionen

MySQL Duplicate Entry Auto-Inc

Ein Thema von JRichmann · begonnen am 29. Dez 2015 · letzter Beitrag vom 31. Dez 2015
Antwort Antwort
Seite 1 von 3  1 23      
JRichmann

Registriert seit: 8. Dez 2009
Ort: Pattensen
57 Beiträge
 
Delphi XE5 Architect
 
#1

MySQL Duplicate Entry Auto-Inc

  Alt 29. Dez 2015, 14:58
Datenbank: MySQL • Version: 5.5.X • Zugriff über: UniDac
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
Jörg Richmann
  Mit Zitat antworten Zitat
Benutzerbild von borncrush
borncrush

Registriert seit: 18. Dez 2005
Ort: Berlin
115 Beiträge
 
Delphi XE7 Enterprise
 
#2

AW: MySQL Duplicate Entry Auto-Inc

  Alt 29. Dez 2015, 15:05
Kannst Du zeigen, wie Du die DB befüllst (SQL-Statement)?
Delphi programming
  Mit Zitat antworten Zitat
JRichmann

Registriert seit: 8. Dez 2009
Ort: Pattensen
57 Beiträge
 
Delphi XE5 Architect
 
#3

AW: MySQL Duplicate Entry Auto-Inc

  Alt 29. Dez 2015, 15:19
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;
Jörg Richmann

Geändert von TBx (31. Dez 2015 um 09:20 Uhr) Grund: Delphi-Tags eingefügt
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#4

AW: MySQL Duplicate Entry Auto-Inc

  Alt 29. Dez 2015, 16:31
Ist die 'id' in dem Statement enthalten? 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;
  Mit Zitat antworten Zitat
JRichmann

Registriert seit: 8. Dez 2009
Ort: Pattensen
57 Beiträge
 
Delphi XE5 Architect
 
#5

AW: MySQL Duplicate Entry Auto-Inc

  Alt 29. Dez 2015, 16:36
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).
Jörg Richmann
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#6

AW: MySQL Duplicate Entry Auto-Inc

  Alt 29. Dez 2015, 16:50
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.
  Mit Zitat antworten Zitat
JRichmann

Registriert seit: 8. Dez 2009
Ort: Pattensen
57 Beiträge
 
Delphi XE5 Architect
 
#7

AW: MySQL Duplicate Entry Auto-Inc

  Alt 29. Dez 2015, 18:55
> 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)
Jörg Richmann
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#8

AW: MySQL Duplicate Entry Auto-Inc

  Alt 29. Dez 2015, 19:09
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?
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: MySQL Duplicate Entry Auto-Inc

  Alt 29. Dez 2015, 20:22
Hat denn jeder Thread auch seine eigene Connection?

Wenn nicht, dann ist das auch kein Wunder mit der doppelten ID Vergabe.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#10

AW: MySQL Duplicate Entry Auto-Inc

  Alt 30. Dez 2015, 06:50
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
Gruß, Jo
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:38 Uhr.
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