Rolf B: Gibt es eine Alternative zu SELECT MAX(ID) FROM Tabellenname

Beitrag lesen

Hallo bjbender,

das wird nicht am SELECT allein liegen. Hier hilft nur Logging und Debugging, und genaues Nachdenken über die SQL-Statements, die im Verlaufe der Web-Requests abgesetzt werden.

Ein SELECT MAX(ID) kann auf zwei Arten laufen. Ist die ID erstes Feld eines Index, kann die Abfrage mit einem reinen Indexzugriff befriedigt werden. Ist sie in einem Index, aber nicht erstes Feld, macht der SQL Server entweder einen Index- oder Table-Scan. Und der kann hängenbleiben, wenn ein parallel laufendes Script einen Lock auf die Table hält (UPDATE, INSERT oder DELETE hinterlassen sowas).

Wenn du vor dem SELECT MAX(ID) noch einen anderen UPDATE gemacht hast, kann es zum Deadlock kommen (Script A wartet auf Script B und B wartet auf A). Sowas wird vom SQL Server typischerweise nach 2-3 Minuten abgebrochen und als entsprechender SQL Fehler an den Aufrufer gemeldet.

Dass es ein Deadlock ist, d.h. dass ein SQL Statement hängenbleibt, musst Du Dir aber erstmal beweisen. Dazu ist auch die Frage wichtig, welche Storage Engine Du einsetzt (wenn Du MySQL verwendest): InnoDB oder MyISAM? Das Lockingverhalten ist unterschiedlich, lies das im Handbuch nach. Bei InnoDB kannst Du über innodb_lock_wait_timeout (mit SET SESSION) die Wartezeit beeinflussen, bis ein Deadlock angenommen wird.

Aber vielleicht bricht ja auch was anderes ab. Die Möglichkeiten sind vielfältig. Produziert JavaScript oder PHP einen Fehler? Was loggst Du? Was steht in der Browserkonsole?

Rolf

--
sumpsi - posui - clusi